我需要一个函数来查找这种嵌套数据中的重复颜色
[“黑色”,“白色”,“红色”,“黑色”,[“黑色”,“紫色”,“蓝色”,[“紫色”,“黄色”,“绿色”,“灰色”] ,'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)
答案 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)));