将filter()函数的结果存储在变量中时,为什么结果不同?

时间:2019-04-12 03:52:20

标签: javascript arrays

我正在使用filter()splice()函数来编辑和设置数组中的值。但是,我注意到我返回的内容与变量中存储的内容不同。

例如:我控制台登录myArray并返回myArray,这两个都返回[1,5,30,1];但是,当我console.log(myArr2)时,结果是[1,5,29,1]

我知道,如果我返回(e)会得到正确的数组,但是我对为什么返回myArray不能正常工作感到困惑?

const myArray = [1, 5, 29, 30, 1];

const myArr2 = myArray.filter(function(e, i)
{
    if (e === 29)
    {
        console.log(e, i);
        myArray.splice(i, 1);
    }

    console.log(myArray);
    return myArray;
});
    
console.log(myArr2);

2 个答案:

答案 0 :(得分:1)

请注意,Array.splice()会在您迭代过滤过程时突变class ScreenOne(Screen): print_ip = StringProperty('') ... def update_ip(self,*args): try: # connect to the host -- tells us if the host is actually # reachable socket.create_connection(("www.google.com", 80)) stringIP = subprocess.check_output(["hostname", "-I"]).split()[0] self.print_ip = str(stringIP).strip("b'") print(f"ip={self.print_ip}") except OSError: self.print_ip = "[b][color=ff0000]Error[/color][/b]" print("not Ip ") ,并且会产生副作用

说明:

在过滤过程中,当您决定过滤myArray时是否过滤e时,索引29将是i。那时,2已从29中移除,myArray现在位于索引30处。这是由以下代码引起的:

2

不过,与此同时,您为if (e ===29) { console.log(e, i); myArray.splice(i, 1); } 返回了一个 truthy 值(return myArray),表示元素e = 29将在过滤后的数组中({ {1}})。现在在下一次迭代中,在索引29处,myArr2的值将为i = 3,因为您已经对e进行了突变,先删除了元素1,然后{{ 1}}将永远不会在经过筛选的过程中访问。

解决方案:

如果您需要获得一个滤除元素myArray的新数组,则可以在过滤过程中为其简单返回30

30
29

或者,以一种简化的方式:

false
const myArray = [1, 5, 29, 30, 1];

const myArr2 = myArray.filter(function(e)
{
    if (e === 29)
        return false;

    return true;
});

console.log("myArray:", myArray); // Not mutated!
console.log("myArr2:", myArr2); // 29 is out!

答案 1 :(得分:0)

我认为您想使用javascript中的过滤器从数组中删除特定值。您可以尝试这种方式。可能满足您的需求。

const myArray = [1,5,29,30,1];
const result = myArray.filter(item => item != 29);
console.log(result);