我的输入是
let data = [
[1,2,3],
[1,3,2,4],
[3,2,1,5],
[1,2,3],
[3,2,1]
];
在此代码和平之后:
var dataUnique = data.reduce(function (out, item) {
return out.concat(out.filter(function (comp) {
return item.toString() == comp.toString();
}).length ? [] : [item])
}, []);
console.log(data, dataUnique);
输出给我4个元素的数组
[1,2,3],
[1,3,2,4],
[3,2,1,5],
[3,2,1]
但预期输出
[1,2,3],
[1,3,2,4],
[3,2,1,5]
任何人都可以建议任何解决方案。 感谢。
答案 0 :(得分:1)
您可以创建某种哈希 - 对象,地图,集等,并使用输入的字符串版本作为键。以下是使用Set:
的示例
let data = [
[1,2,3],
[1,3,2,4],
[3,2,1,5],
[1,2,3],
[3,2,1]
];
let set = new Set()
let result = data.reduce((a, i) => {
let k = i.concat().sort().join('_')
if (!set.has(k)) {
set.add(k)
a.push(i)
}
return a
}, [])
console.log(result)
如果您不介意输出具有输入的排序版本,这可能会更简单一些。
答案 1 :(得分:0)
这是使用reduce
,every
和includes
函数的替代方案。
基本上,这种方法会检查先前检查过的数组中是否存在一个数字。
let data = [ [1, 2, 3], [1, 3, 2, 4], [3, 2, 1, 5], [1, 2, 3], [3, 2, 1]],
result = data.reduce((a, c) => {
c.forEach(n => {
if (a.length == 0 || !a.every(arr => arr.includes(n))) a.push(c);
});
return a;
}, []);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }