JavaScript:为什么我不能用.push()链接Array.prototype.filter?

时间:2014-02-21 11:29:42

标签: javascript arrays filtering chaining method-chaining

如果Array.prototype.filter返回一个数组,为什么我不能立即在这个返回值上调用push()

示例:

var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; });
// result: ["a", "ab", "ad"]

arr2.push("aaa");
// result: ["a", "ab", "ad", "aaa"]

好到目前为止。

但是,push()拨打filter()电话的链接呢?

var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; }).push("aaa");
// result: 4

为什么链接filter()push()导致我期望的元素数量,而不是这些元素的数组?

2 个答案:

答案 0 :(得分:8)

问题不在于filter()返回的内容,而在于push()返回的内容。

push() 返回数组的新长度,而不是数组本身。

所以当你这样做时:

var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; }).push("aaa");

arr2将被赋予数组的新长度(在您的情况下恰好是4),而不是新数组。

一个可以做你想做的修改版本:

var arr = ["a", "ab", "c", "ad"], arr2;
(arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; })).push("aaa");
// now arr2 is ["a", "ab", "ad", "aaa"]

答案 1 :(得分:2)

我建议您使用concat();

var arr = ["a", "ab", "c", "ad"], arr2;
(arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; })).concat("aaa");
// now arr2 is ["a", "ab", "ad", "aaa"]