在不产生副作用的情况下过滤和更改变量的值

Filtering and changing value of variable without causing a side effect

本文关键字:改变 变量 过滤 情况下 副作用      更新时间:2023-09-26

我只想过滤数组中大于10的数字,并在不产生副作用的情况下更改原始变量。

我在做什么:

let numbers = [15, 5, 2, 1, 59, 29];
numbers = numbers.filter((number) => {
  if (number > 10) return number;
});

是有效的,但这会产生副作用,对吧?有可能在没有副作用的情况下做到这一点,并且仍然使用相同的varialla名称吗?

谢谢。

所以。。。您正在做的是将原始数组numbers替换为包含已筛选信息的新数组。如果您想对初始数组进行变异,则需要更多的代码。它需要更多代码的原因是,在对数组进行循环时,您正在讨论修改数组的长度,这是一种糟糕的做法。

要做到这一点,您可以在数组中循环一次,然后找到值大于10的所有索引。然后,一旦拥有了所有索引,就可以对它们进行循环并拼接出数组的这些部分。

下面的代码是如何做到这一点的。不确定是否最有效,但这是一种方法。

let numbers = [15, 5, 2, 1, 59, 29];
let badIndices = [];
numbers.forEach( (val, idx) => {
    if(val > 10) badIndices.push(idx);
});
badIndices = badIndices.reverse();
badIndices.forEach( i => numbers.splice(i, 1));

在拼接之前,您需要颠倒索引的顺序,否则后续索引的偏移量将被关闭。换句话说,您需要从末尾开始向前拼接。否则,从前面删除会更改后续索引,从而使函数无效。