从另一个对象中删除对象 - 意外行为

时间:2017-03-13 22:09:18

标签: javascript

我无法使用此JSfiddle代码解决此意外行为。 基本上我想删除carsforsale之类的单词。如果您检查控制台数据输出没有carsvar data = [{"key":"ford","doc_count":8967},{"key":"cars","doc_count":4684},{"key":"carsforsale","doc_count":2487},{"key":"forddaytona","doc_count":1220},{"key":"daytona500","doc_count":1176},{"key":"forsale","doc_count":1171}] for (var i in data) { if ((data[i]['key'] == 'ford') || (data[i]['key'] == 'cars') || (data[i]['key'] == 'carsforsale')) { console.log(data[i]['key']); delete(data[i]); data.splice(i, 1); } } ,但$pattern1 = [regex]'([___)' $pattern2 = [regex]'([___)' Get-ChildItem 'C:\\File\\Location\\*.txt' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace $pattern1, ('$1'+'FOO')} | ForEach { $_ -replace $pattern2, ('$1'+'FOO')}) | Set-Content $_ } 仍在对象中。我不知道为什么。有人能告诉我删除这些嵌套对象的正确方法吗?感谢

代码:

type

2 个答案:

答案 0 :(得分:2)

在迭代迭代时,您正在从正在迭代的对象中删除元素。这意味着每次移除时事物都会向下移动1,但是你会继续在列表中向前移动,从而错过一些元素。

反向遍历列表或删除元素时执行i--

例如:

-> i = 0, it points at ford
-> you delete ford
-> everything moves down by 1
-> i = 0, now points at cars
-> you increase i by 1
-> i =1, it points at carsforsale

你永远不会指向cars

答案 1 :(得分:0)

您在代码中遇到了几个问题:

  1. 不要使用for .. in来迭代数组

  2. 不要使用delete从数组中删除元素 - 它确实删除了数据,但保留了密钥

  3. 在使用splice修改数组时,非常小心

  4. 在这种情况下,您的问题是,每当您调用.splice指数发生变化时 - 删除的索引后面的其余元素将被拖曳一个,但您仍然在原始范围内进行迭代。紧接着的元素将被忽略,因为您已经处理了该索引。

    如果使用Array.prototype.filter创建一个省略不需要元素的新数组会更简单:

    let newArray = oldArray.filter(
      e => e.key !== 'ford' && e.key !== 'cars' && e.key !== 'carsforsale'
    );
    

    或解构:

    let newArray = oldArray.filter(
      ({ key }) => key !== 'ford' && key !== 'cars' && key !== 'carsforsale'
    );