如果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()
导致我期望的元素数量,而不是这些元素的数组?
答案 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"]