Javascript

时间:2018-04-29 01:02:57

标签: javascript

我的输入是

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]

任何人都可以建议任何解决方案。 感谢。

2 个答案:

答案 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)

这是使用reduceeveryincludes函数的替代方案。

基本上,这种方法会检查先前检查过的数组中是否存在一个数字。



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