concat和push之间的区别?

时间:2017-06-15 15:58:20

标签: javascript

为什么返回push方法导致" Uncaught TypeError: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;
}




4 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:2)

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

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

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


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

答案 2 :(得分:1)

根据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));

答案 3 :(得分:0)

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