Как найти повторяющиеся значения во вложенных данных, как это - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужна функция для поиска дубликатов цветов во вложенных данных такого типа

['black', 'white', 'red', 'black', ['black', 'purple', 'синий », [« фиолетовый »,« желтый »,« зеленый »,« серый »],« фиолетовый »]]

ожидаемый результат:

(2) ["Purple", "Yellow"]

Пробный:

var color=['Blue', 'Red', 'Purple', 'Grey', 'Purple', 'Yellow', 'Yellow']

var uniq = color
.map((name) => {
  return {count: 1, name: name}
})
.reduce((a, b) => {
  a[b.name] = (a[b.name] || 0) + b.count
  return a
}, {})

var duplicates = Object.keys(uniq).filter((a) => uniq[a] > 1)

console.log(duplicates)

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Сначала я спроецировал бы массив на карту вхождений определенного элемента, а затем вы можете просмотреть этот список, чтобы определить дубликаты элементов (и сколько раз он появляется, если хотите)

var arr = ['black', 'white', 'red', 'black', ['black', 'purple', 'blue', ['purple', 'yellow', 'green', 'gray'], 'purple']];

var occurrences = arr.flat(2).reduce(function(prev, cur) {
  prev[cur] = (prev[cur] || 0) + 1;
  return prev;
}, {});

var duplicates = Object.keys(occurrences).filter(key => occurrences[key] > 1);
0 голосов
/ 08 февраля 2019

Программа проверит, является ли значение массивом, если его массив мы выполним рекурсию для обработки внутреннего массива, в противном случае добавим значение к Установить объект

var colors = ['black', 'white', 'red', 'black', ['black', 'purple', 'blue', ['purple', 'yellow', 'green', 'gray'], 'purple']];

function uniqueFunc(arr) {
    return arr.reduce(function (colorSet, value) {
        if (Array.isArray(value)) { uniqueFunc(value, colorSet); } else { colorSet.add(value) }
        return colorSet;
    }, arguments[1] ? arguments[1] : new Set());
}

console.log(Array.from(uniqueFunc(colors)));
0 голосов
/ 08 февраля 2019

Вы можете использовать .flat с .reduce и добавлять элемент только в накопленный Набор , если он не отображается в другом индексе вмассив.

const colors = ['black', 'white', 'red', 'black',[ 'black', 'purple', 'blue',[ 'purple', 'yellow', 'green', 'gray'], 'purple']],

[...duplicates] = colors
                   .flat(2)
                   .reduce((acc, col, i, src) => 
                     src.lastIndexOf(col) !== i 
                     ? acc.add(col) : acc, 
                   new Set);

console.log(duplicates);
...