【问题标题】:Concatenate unknown amount of argument arrays. Throw duplicates连接未知数量的参数数组。抛出重复项
【发布时间】:2019-07-10 12:54:24
【问题描述】:

函数接受未知数量的数组作为参数。这些数组也可以包含嵌套数组。我需要抛出重复项并返回一个新数组(没有重复项)。数组元素不应该以排序的方式出现,而是按照它们的顺序,它们位于原来的数组中。

我使用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,那就太好了。

在这些情况下抛出的错误是:

返回 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]

【问题讨论】:

  • 将初始值[] 添加到.reduce。它失败了,因为它在第一个测试用例中执行1.concat
  • 预期输出是什么?
  • 您正在传递多个参数,但该函数只有一个要接收的参数

标签: javascript arrays arguments concatenation


【解决方案1】:

如果它是一个数组,您可以检查该项目并将这个数组扁平化。

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

【讨论】:

    【解决方案2】:

    那是因为你的函数签名只接受一个参数,arr。在这里你只传递了一个:

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

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

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

    因此它只需要[1, 3, 2],忽略其他,并尝试减少第一个,从第一个元素1开始,这显然不是一个数组,它没有concat

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

    function uniteUnique(...test) {
    
      let flat = test.reduce(function(a, b) {
        return a.concat(b);
      });
    
      let unique = new Set(flat);
    
      console.log(unique);
    }
    

    使用spread syntax,您将所有参数作为数组放入test

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

    const flatUnique = (...test) => new Set(test.flat())
    

    而且,如果您想要一个数组而不是 Set,您可以再次使用扩展语法将其取回:

    const flatUnique = (...test) => [...new Set(test.flat())]
    

    【讨论】:

      【解决方案3】:

      您可以使用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; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 2017-07-13
        • 2016-04-07
        相关资源
        最近更新 更多