【问题标题】:JavaScript. Filtering an array with the Splice() method [duplicate]JavaScript。使用 Splice() 方法过滤数组 [重复]
【发布时间】:2022-01-02 17:07:33
【问题描述】:

我需要写一个函数

filterRangeInPlace(arr, a, b)

接受一个数组和两个数字,并从数组中删除不在 ab 范围内的所有元素。所以支票看起来像

a ≤ arr[i] ≤ b

我想用 for 循环和拼接方法来做。但无法弄清楚为什么该函数将某些元素保留在范围之外,在我的例子中,它是 number 3。这不是家庭任务或其他什么,我只是在练习数组方法。这是我的代码:

let myArr = [1, 3,  8, 3, 9, 5, 3, 4, 10, 7, 6, 1]

function filterRangeInPlace( arr, a, b ) {
    for ( i = 0; i < arr.length; i++ ) {
        if ( arr[i] < a || arr[i] > b ) {
            arr.splice(i, 1)
        }
    }
}

filterRangeInPlace(myArr, 4, 9)

console.log(myArr) // [3, 8, 9, 5, 4, 7, 6]

我知道我在某处弄乱了索引,但不知道在哪里以及如何,因为其余的工作正常。谢谢!

【问题讨论】:

  • 如果你删除一个元素,你不能增加索引,因为这样你就跳过了元素。更好的是从头到尾遍历数组。这样你就不需要关心索引...

标签: javascript arrays for-loop array-splice


【解决方案1】:

如果你在这里使用拼接,你应该从数组的末尾开始迭代,然后到第一个元素:

for (i = arr.length - 1; i >= 0; i--) {

假设您要删除第一个元素,即 1 在位置 0 然后删除数组后将是

[3, 8, 3, 9, 5, 3, 4, 10, 7, 6, 1]

当时i 递增并变为1,所以现在它将指向8 作为1 索引。

所以使用splice 会跳过一些步骤

let myArr = [1, 3, 8, 3, 9, 5, 3, 4, 10, 7, 6, 1];

function filterRangeInPlace(arr, a, b) {
  for (i = arr.length - 1; i >= 0; i--) {
    if (arr[i] < a || arr[i] > b) {
      arr.splice(i, 1);
    }
  }
}

filterRangeInPlace(myArr, 4, 9);
console.log(myArr);

【讨论】:

  • 请不要在明显重复的地方发布答案
【解决方案2】:

当您使用splice 时,您仍然处于同一个循环中,您会跳过一些索引(因为 splice 会删除一些项目,因此会更改索引)。

在您的示例中,第一个 1 被删除,因此 3 成为第一个,但随后您跳到第二个(循环中的i++)。您不会仔细检查相同的索引。

我建议使用filter 方法来执行此操作,或者只是将i-- 放在splice 之后。

【讨论】:

  • 要求是过滤 就地 ,这在过滤器中是不可能的......并且在不操作循环索引的情况下解决这个问题的直接解决方案是向后遍历数组...
  • 谢谢!我从来没想过。
  • 你说得对,我错过了。所以i--splice 会是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2017-03-25
  • 2018-01-18
  • 2023-01-02
  • 1970-01-01
相关资源
最近更新 更多