连接和推送之间的区别?
Difference between concat and push?
为什么 push
方法的 return 导致
Uncaught TypeError: acc.push is not a function
但是 return 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;
}
acc
不应该是数组。看看documentation。 可以是一个,但是..
reduce
一个数组对一个数组完全没有意义。你要的是filter
。我的意思是,reduce
使用数组作为累加器并 concat
将每个元素添加到它在技术上确实有效,但这不是正确的方法。
var res = [1, 2, 3, 4].filter(even);
console.log(res);
function even(number) {
return (number % 2 === 0);
}
push()
将元素添加到数组的末尾,returns 是数组的新长度。所以你这里的return是无效的
concat()
方法用于合并数组。 Concat 不会更改现有数组,而是 return 一个新数组。
更好地过滤,如果你想要一个像这样的新数组:
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);
});
https://dev.to/uilicious/javascript-array-push-is-945x-faster-than-array-concat-1oki
Concat 比 push 慢 945 倍,只是因为它必须创建一个新数组。
根据MDN文档说:
push()
方法:将一个或多个元素添加到数组的末尾并且returns 数组的新长度.
const count = ['pigs', 'goats'].push('cows');
console.log(count); // expected output: 3
concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是 returns 一个新数组y
console.log(['a'].concat(['b']));// expected output: Array ["a", "b"]
并且结合最后Array#reduce
的参数是数组初始化[])
,也就是说你要return一个数组结果.
==> 这就是为什么你使用 concat
效果很好的原因。
重构代码
- 如果您仍想使用
Array#reduce
和 Array#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);
- 更简单的方法是使用
Array#filter
const even = (number) => number%2 === 0;
console.log([1, 2, 3, 4].filter(even));
为什么 push
方法的 return 导致
Uncaught TypeError: acc.push is not a function
但是 return 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;
}
acc
不应该是数组。看看documentation。 可以是一个,但是..
reduce
一个数组对一个数组完全没有意义。你要的是filter
。我的意思是,reduce
使用数组作为累加器并 concat
将每个元素添加到它在技术上确实有效,但这不是正确的方法。
var res = [1, 2, 3, 4].filter(even);
console.log(res);
function even(number) {
return (number % 2 === 0);
}
push()
将元素添加到数组的末尾,returns 是数组的新长度。所以你这里的return是无效的
concat()
方法用于合并数组。 Concat 不会更改现有数组,而是 return 一个新数组。
更好地过滤,如果你想要一个像这样的新数组:
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);
});
https://dev.to/uilicious/javascript-array-push-is-945x-faster-than-array-concat-1oki Concat 比 push 慢 945 倍,只是因为它必须创建一个新数组。
根据MDN文档说:
push()
方法:将一个或多个元素添加到数组的末尾并且returns 数组的新长度.
const count = ['pigs', 'goats'].push('cows');
console.log(count); // expected output: 3
concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是 returns 一个新数组y
console.log(['a'].concat(['b']));// expected output: Array ["a", "b"]
并且结合最后Array#reduce
的参数是数组初始化[])
,也就是说你要return一个数组结果.
==> 这就是为什么你使用 concat
效果很好的原因。
重构代码
- 如果您仍想使用
Array#reduce
和Array#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);
- 更简单的方法是使用
Array#filter
const even = (number) => number%2 === 0;
console.log([1, 2, 3, 4].filter(even));