连接未知数量的参数数组。扔重复

时间:2019-02-16 16:36:30

标签: javascript arrays arguments concatenation

一个函数将未知数量的数组作为参数。这些数组也可以由嵌套数组组成。我需要抛出重复并返回一个新数组(不重复)。数组元素不应以排序的方式出现,而应按其顺序排列,并位于其原始数组中。

我使用map将每个数组推入一个新数组。 我用reduce来连接数组。 我用Set扔了重复的东西。

仅在这种情况下有效

uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]);

我不知道,为什么在这些情况下它不起作用:

Argument Fail1 // uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);

Argument Fail2 // uniteUnique([1, 3, 2], [1, [5]], [2, [4]]);
Argument Fail3 // uniteUnique([1, 2, 3], [5, 2, 1]);

这是我的代码

function uniteUnique(arr) {
  let test = [];
  arr.map(function(argu) {
    test.push(argu);
  }, []);

  let flat = test.reduce(function(a, b) {
    return a.concat(b);
  });

  let unique = new Set(flat);

  console.log(unique);
}

怎么了?如果有人可以告诉我,为什么我的代码不能与Argument Fail 1-3(参数失败1-3)一起使用,将是非常好。

在这些情况下引发的错误是:

  

返回a.concat(b); / n                 TypeError:a.concat不是函数

预期输出: uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])应该返回[1, 3, 2, 5, 4]uniteUnique([1, 3, 2], [1, [5]], [2, [4]])应该返回[1, 3, 2, [5], [4]]uniteUnique([1, 2, 3], [5, 2, 1])应该返回[1, 2, 3, 5]uniteUnique([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])应该返回[1, 2, 3, 5, 4, 6, 7, 8]

3 个答案:

答案 0 :(得分:4)

您可以检查该项目是否为数组并将其平整。

const
    flat = array => array.reduce((r, a) => r.concat(Array.isArray(a) ? flat(a) : a), []),
    uniteUnique = (...array) => [...new Set(flat(array))];

console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

这是因为您的函数签名仅采用一个参数arr。在这里,您只传递了一个:

  

uniteUnique([[1、2、3],[5、2、1],[2、3、4]]);

这就是它起作用的原因。在失败情况下,您需要传递多个数组:

  

uniteUnique([1,3,2],[5,2,1,4],[2,1]);

因此,只需要[1, 3, 2],忽略其他元素,并尝试从第一个元素1开始缩小第一个,显然这不是数组,并且没有{{ 1}}。

您要做的是更改方法签名-并删除无用的concat

map

使用spread syntaxfunction uniteUnique(...test) { let flat = test.reduce(function(a, b) { return a.concat(b); }); let unique = new Set(flat); console.log(unique); } 的所有参数作为数组放入。

顺便说一句,您也可以在实现的地方使用Array.flat(或在没有的地方使用polyfill):

test

而且,如果要使用数组而不是const flatUnique = (...test) => new Set(test.flat()) ,则可以再次使用扩展语法将其取回:

Set

答案 2 :(得分:0)

您可以使用flatSet

const uniteUnique = (array) => [...new Set(array.flat(Infinity))];

console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }