2015-07-03 104 views
0

我有一个obj和一个对象数组 - 像下面的东西(我没有粘贴它,因为它的巨大)。我试图循环对象数组 - 从数组中删除那些包含值的对象。我写了下面的代码...(使用lodash)JavaScript从数组中删除所有包含值的对象

当在数组上循环时,它随机缺少一些'Foo's - 所以不是所有的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

好像你想要[Array.prototype.filter]( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) – Grundy

回答

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>

+0

接受此作为答案,因为我的原始问题确实包括lodash – Rob

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); 
    } 
} 
+0

就像有效,这是我通常使用各种语言的原始数组来做事情 – Rhumborl

相关问题