JavaScript:为什么我不能在 Array.prototype.filter 中使用 .push() 进行链式操作?

5
如果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()链式调用会得到预期的元素数量,而不是这些元素的数组?
3个回答

11

问题不在于 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"]

当然,当然...这是那种让你自己的SO问题让你感到愚蠢的时刻之一。 - awj

4
我建议您使用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"]

-1

现在运行上述代码并查看结果/错误。

分析运行代码前后的答案差异。

Q2. 更正代码以使方法链开始工作。

function filterOddNumbers(num) {
    if (num % 2 === 0) {
        return true;
    } else {
        return false;
    }
}

const evenNumbers = [1, 2, 3, 4, 5].push().filter(filterOddNumbers);

const evenNumbers = [1, 2, 3, 4, 5].push().filter(filterOddNumbers);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接