如何在这样的嵌套数据中查找重复值

时间:2019-02-08 11:25:34

标签: javascript arrays duplicates find

我需要一个函数来查找这种嵌套数据中的重复颜色

[“黑色”,“白色”,“红色”,“黑色”,[“黑色”,“紫色”,“蓝色”,[“紫色”,“黄色”,“绿色”,“灰色”] ,'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 :(得分:1)

您可以将.flat.reduce一起使用,并且仅将其添加到累积的Set中(如果它没有出现在数组的另一个索引中)。

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

答案 1 :(得分:0)

我首先将数组投影到特定项的出现图中,然后您可以查看该列表以确定重复项(如果需要,还可以查看重复项的次数)

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

答案 2 :(得分:0)

程序将检查该值是否为数组,如果是数组,我们将进行递归处理内部数组,否则将值添加到Set object

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