过滤和更改变量值而不会产生副作用

时间:2016-08-01 01:24:05

标签: javascript filter functional-programming

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

我在做什么:

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

正在工作,但这会引起副作用,对吧?是否可以在没有副作用的情况下这样做,并且仍然使用相同的变量名称?

感谢。

1 个答案:

答案 0 :(得分:1)

所以...你正在做的是用一个带有过滤信息的新数组替换原始数组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));

您希望在拼接之前反转索引的顺序,否则后续索引的偏移将关闭。换句话说,您将要从头到尾开始拼接。否则,从前面删除会更改后续索引,从而使该函数无效。