我正在使用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);
答案 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);