JS: печать массива повторяющихся значений - PullRequest
1 голос
/ 06 января 2020

Мне нужно напечатать дубликаты из массива.

Например, с учетом следующего массива и индекса, функция выведет 6,23,33,100.

var array = [3,6,67,6,23,11,100,8,93,0,17,24,7,1,33,45,28,33,23,12,99,100];

Видимо, нам нужно сделайте это, используя два цикла while.

Я ищу решение, но что более важно, объяснение. Ссылки очень ценятся.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 06 января 2020

Самое элегантное и эффективное решение состоит в использовании while l oop, который повторяет массив только один раз, поэтому мы имеем O(N) сложность.

Для этого нам нужно объявить hash, в котором хранится число вхождений для каждого элемента массива . Если мы нашли duplicate один, то мы храним его в массиве duplicates.

var arr = [3,6,67,6,23,11,100,8,93,0,17,24,7,1,33,45,28,33,23,12,99,100], i = 0, hash = {}, duplicates = [];
while(i < arr.length){
  hash[arr[i]] = hash[arr[i]] ? hash[arr[i]] += 1 : 1;
  if (hash[arr[i]] === 2) 
    duplicates.push(arr[i])
  i++;
}

console.log(duplicates)
1 голос
/ 06 января 2020

Вы можете использовать методы filter () и indexOf () .

var array = [3,6,67,6,23,11,100,8,93,0,17,24,7,1,33,45,28,33,23,12,99,100];
console.log(array.filter((a,b,c) => c.indexOf(a) !== b));

a -> - это значение, передаваемое в функции стрелки.

b -> - это передаваемый индекс.

c -> - весь передаваемый массив.

Эта строка фильтрует массив на основе, если исходный массив имеет значение (аргумент a), индекс которого не соответствует данному индексу, переданному через функция стрелки (аргумент b).

0 голосов
/ 06 января 2020

Для кратчайшего подхода вы можете взять закрытие

(s =>                           )(       )

с Set

(s =>                           )(new Set)

и чеком. Если значение уже замечено, тогда примите это значение

(s => v => s.has(v)             )(new Set)

или добавьте значение к набору и верните false, потому что невидимое значение не должно быть в наборе результатов.

(s => v =>             !s.add(v))(new Set)

var array = [3, 6, 67, 6, 23, 11, 100, 8, 93, 0, 17, 24, 7, 1, 33, 45, 28, 33, 23, 12, 99, 100],
    duplicates = array.filter((s => v => s.has(v) || !s.add(v))(new Set));

console.log(duplicates);
0 голосов
/ 06 января 2020

Хороший пример и объяснение можно найти здесь ... W3Resource

Далее, чтобы помочь в понимании двух основных компонентов кода Object ... Работа с объекты - Javascipt

и массивы ... массивы Javascipt

...