我无法使用此JSfiddle代码解决此意外行为。
基本上我想删除carsforsale
之类的单词。如果您检查控制台数据输出没有cars
和var 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
答案 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)
您在代码中遇到了几个问题:
不要使用for .. in
来迭代数组
不要使用delete
从数组中删除元素 - 它确实删除了数据,但保留了密钥
在使用splice
修改数组时,非常小心
在这种情况下,您的问题是,每当您调用.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'
);