Есть ли какой-нибудь потрясающий способ оставить каждый из отдельных элементов из массива?

#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)