#javascript #arrays #performance
#javascript #массивы #Производительность
Вопрос:
я хочу создать эффективный код Javascript. если есть массив, подобный [a1, b2, a1, c3, .. , b2, c5, .. ,c3] , результат, который я хочу получить, будет [a1, b2, c3, c5] . Таким образом, я хочу получить массив, содержащий только один из каждого отдельного элемента исходного массива. есть ли какой-нибудь хороший способ, который более эффективен, чем ПОЛНОЕ СКАНИРОВАНИЕ? (я имею в виду более эффективный, чем код, подобный
for (var i=0; i < origArray.length; i ) {
if (!tempArray.includes(origArray[i])) {
tempArray.push(array[i]);
}
}
)
спасибо.
Комментарии:
1. что вы имели в виду под эффективностью? Лучшая временная сложность или более короткий код для написания? Если это последнее, вы можете сделать const temArray = […new Set(OrigArray)] Предполагая, что OrigArray содержит только число или строку
2. @CharlieNg о, эффективность, о которой я упоминал, означает лучшую временную сложность . спасибо за ваш комментарий.
3. @CharlieNg Это, вероятно, также более быстрый вариант, поскольку
Set
он будет реализован на родном языке, а не на JavaScript.
Ответ №1:
Вы можете сделать что-то вроде этого. Вы можете сначала отсортировать массив, а затем сохранить каждый элемент только один раз. Это больше кода, но временная сложность равна O (n log (n))
let arr = ['a1', 'b2', 'a1', 'c3', 'b2', 'c5','c3'];
arr.sort(function(a, b){
if(a < b) return -1;
if(a > b) return 1;
return 0;
})
let currentItem = '';
let output = [];
arr.forEach(function (item) {
if (currentItem != item) {
output.push(item)
currentItem = item;
}
})
console.log(output)