【发布时间】:2021-07-30 03:08:17
【问题描述】:
我有数组数组,每个数组都有唯一的 items 。 我需要找到所有数组之间的所有重复项并将其收集到新数组中。
对于这个输入: [[1,2,6,9],[3,2,7,5,12],[1,3]]
我需要这个输出: [1,2,3]
现在有人知道最好的方法是什么吗?
【问题讨论】:
标签: javascript arrays duplicates
我有数组数组,每个数组都有唯一的 items 。 我需要找到所有数组之间的所有重复项并将其收集到新数组中。
对于这个输入: [[1,2,6,9],[3,2,7,5,12],[1,3]]
我需要这个输出: [1,2,3]
现在有人知道最好的方法是什么吗?
【问题讨论】:
标签: javascript arrays duplicates
您可以对对象进行闭包以计算值。
const
data = [[1, 2, 6, 9], [3, 2, 7, 5, 12], [1, 3]],
result = data
.flat()
.filter(
(o => v => (o[v] = (o[v] || 0) + 1) === 2)
({})
);
console.log(result);
【讨论】:
你可以试试这个,最好用O(3N)=== O(N) complexity
let arr = [
[1, 2, 6, 9],
[3, 2, 7, 5, 12],
[1, 3]
];
let a = arr.flat()
let obj = {};
for (let i = 0; i < a.length; i++) {
if (obj[a[i]]) obj[a[i]]++;
else obj[a[i]] = 1
}
let repeated = [];
for (let i in obj) {
if (obj[i] > 1) {
repeated.push(i)
}
}
console.log(repeated)
【讨论】:
根据“重复”的含义,@Nina 的解决方案可以修改为仅包含值恰好出现两次的情况。我稍作修改的示例 sn-p 将排除值 1,因为它出现 3 次:
const data = [[1, 2, 6, 9], [3, 2, 7, 5, 12], [1, 3], [1, 7]], k=2, // no. of occurrences
result = data.reduce((o,c,i)=>(c.forEach(v=>o[v]=(o[v]||0)+1),o),[])
.map((v,i,a)=>(a[i] = v===k ? i : undefined ))
.filter(v=>v);
console.log(result);
警告:这仅适用于数值(整数!)。
但这里有另一个版本可以处理任何类型的内容:
var data = [[1, 2, 6, 9, "c"], [3, "a", 2, 7, 5, 12], [1, "c", 3], [1, 7]], k=2;
res=[...data.reduce((o,c,i)=>(c.forEach(v=>o.set(v,(o.get(v)||0)+1)),o),
new Map()).entries()]
.filter(([k,v])=>v===2)
.map(([k,v])=>k)
console.log(res)
更新
如果您想要找到重复项的第一个位置的地址,您可以这样做:
var data = [[1, 2, 6, 9, "c"], [3, "a", 2, 7, 5, 12], [1, "c", 3], [1, 7]], n=2;
res=[...data.reduce((o,c,i)=>(c.forEach(v=>o.set(v,(o.get(v)||0)+1)),o),
new Map()).entries()]
.filter(([k,v])=>v===n)
.map(([k,v],j)=>[data.findIndex((d,i)=>(j=d.indexOf(k))>-1)+"_"+j, k])
console.log(Object.fromEntries(res))
【讨论】:
{"0_2":1,"0_1":2,"1_2":3) 一样?或者,对于我的示例数据,结果将是 {"0_1":2,"0_4":"c","1_0":3,"1_3":7) - 检查我编辑的答案。