我有一个obj,有一系列对象 - 类似于下面的内容(我之前没有粘贴它,因为它很大)。我试图遍历对象数组 - 从数组中删除包含值的那些对象。我写了以下代码......(使用lodash)
当循环遍历数组时,它会随机丢失一些“Foo” - 所以不会删除所有Foo对象......即使它们包含密钥Foo。它确实忽略了那些不包含Foo的东西。
obj = {
array : [
{
key1 : 'Foo',
Key2 : 'fi'
},
{
key1 : 'Foo',
Key2 : 'fi',
Key3 : 'blah'
},
{
key1 : 'Fred',
Key2 : 'fi'
},
{
key1 : 'Foo',
Key2 : 'fi'
}
... etc....
]
}
var items = obj.array
_.forEach(items, function(n, index) {
var isFoo = _.includes(n, 'Foo');
console.log(isFoo);
if (isFoo) {
items.splice(index, 1);
}
});
答案 0 :(得分:1)
我怀疑事情变得混乱,因为你在循环播放它的同时正在更改数组。
_.remove
对您来说可能是更好的选择:
var obj = {
array : [
{
key1 : 'Foo',
Key2 : 'fi'
},
{
key1 : 'Foo',
Key2 : 'fi',
Key3 : 'blah'
},
{
key1 : 'Fred',
Key2 : 'fi'
},
{
key1 : 'Foo',
Key2 : 'fi'
}
]
};
_.remove(obj.array, function(n, index) {
return _.includes(n, 'Foo');
});
console.dir(obj.array)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.js"></script>
&#13;
答案 1 :(得分:1)
我抛弃了lodash,然后做了一个反向for循环(我的想法是,当事情被删除时,索引会改变......也许这会导致错误?)
var items = obj.array;
var i;
for (i = items.length - 1; i >= 0; i -= 1) {
if (items[i].type === 'Foo') {
items.splice(i, 1);
}
}