【问题标题】:Difference between concat and push?concat和push的区别?
【发布时间】:2017-11-18 05:09:00
【问题描述】:

push 方法的返回为什么会导致

未捕获的类型错误:acc.push 不是函数

但是返回 concat 会导致正确的解决方案?

[1, 2, 3, 4].reduce(function name(acc, curr) {
  if (even(curr)) {
    return acc.push(curr);
  }
  return acc;
}, []);


function even(number) {
  if (number % 2 === 0) {
    return true;
  }
  return false;
}

[1, 2, 3, 4].reduce(function name(acc, curr) {
  if (even(curr)) {
    return acc.concat(curr);
  }
  return acc;
}, []);


function even(number) {
  if (number % 2 === 0) {
    return true;
  }
  return false;
}

【问题讨论】:

  • 因为push返回一个数字,而concat返回一个数组。
  • push 将数组作为一项推送,concat 将数组或带有一项的数组推送到不同的返回类型旁边。

标签: javascript concatenation push


【解决方案1】:

acc 不应该是一个数组。看看documentation。它可以是一个,但是..

reduce 一个数组到一个数组完全没有意义。你想要的是filter。我的意思是,reduce 使用数组作为累加器,concat 将每个元素添加到其中在技术上确实有效,但这不是正确的方法。

var res = [1, 2, 3, 4].filter(even);
console.log(res);


function even(number) {
  return (number % 2 === 0);
}

【讨论】:

  • 我同意。这是一道考试题,我被要求使用 reduce 重新实现过滤器。我对规格有点模糊,只是想澄清一下。
  • 假设您有一个数字数组,您想将其转换为这些数字的运行总和的数组,例如。 [1,2,7,4] -> [1,3,10,14]。在这种情况下,将 acc 减少为数组是否合适?
  • 它实际上是一种很好的方法,尤其是如果您将操作链接在一起以避免运行多个循环,请查找“transducers and loop fusion”
  • 如果您将一个数组转换为另一个数组,其值比原始数组短(或长),那么 reduce() 是完美的。
  • 我认为 arr.filter 在这种情况下是一种更好的方法。尽管根据文档,您可以通过这种方式使用 arr.reduce 我认为人们普遍认为 .reduce 用于从数组中的所有值创建一个变量。
【解决方案2】:

push() 将元素添加到数组的末尾并返回数组的新长度。所以你在这里的回报是无效的。

concat() 方法用于合并数组。 Concat 不会改变现有的数组,而是返回一个新的数组。

如果你想要一个这样的新数组,最好过滤:

var arr = [1, 2, 3, 4];
var filtered = arr.filter(function(element, index, array) {
  return (index % 2 === 0);
});

请注意,假设数组 arr 是完整的,没有间隙 - 所有偶数索引值。如果您需要每个人,请使用element 而不是index

var arr = [1, 2, 3, 4];
var filtered = arr.filter(function(element, index, array) {
  return (element% 2 === 0);
});

【讨论】:

    【解决方案3】:

    https://dev.to/uilicious/javascript-array-push-is-945x-faster-than-array-concat-1oki Concat 比 push 慢 945 倍,因为它必须创建一个新数组。

    【讨论】:

      【解决方案4】:

      根据MDN文档说:

      • push() 方法:将一个或多个元素添加到数组的末尾并返回数组的新长度
      const count = ['pigs', 'goats'].push('cows');
      console.log(count); // expected output: 3
      
      • concat() 方法 用于合并两个或多个数组。此方法不会更改现有数组,而是 返回一个新数组y
      console.log(['a'].concat(['b']));// expected output: Array ["a", "b"]
      

      并结合最终Array#reduce的参数是数组初始化[]),这意味着你要返回一个数组结果

      ==> 所以这就是为什么如果你使用concat 效果很好。


      重构代码

      1. 如果你还想使用Array#reduceArray#push

      const even = (number) => number%2 === 0;
      const result = [1, 2, 3, 4].reduce(function name(acc, curr) {
        if(even(curr)) acc.push(curr); // Just add one more item instead of return
        return acc;
      }, []);
      
      console.log(result);
      1. 更简单的方法是使用Array#filter

      const even = (number) => number%2 === 0;
      console.log([1, 2, 3, 4].filter(even));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 2017-09-21
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 2016-11-10
        相关资源
        最近更新 更多