如何在JavaScript中以有效的方式从数组中删除多个项目?

时间:2016-05-11 03:17:19

标签: javascript

让我们说我有一个像这样的对象数组:

var messages = [
    {id: 1, replyTo: null}
    {id: 5, replyTo: null}
    {id: 7, replyTo: null}
    {id: 9, replyTo: 7}
    {id: 10, replyTo: null}
    {id: 12, replyTo: 1}
    {id: 16, replyTo: 1}
    {id: 20, replyTo: 1}
    {id: 24, replyTo: 1}
    {id: 28, replyTo: 1}
    {id: 32, replyTo: 1}
    {id: 36, replyTo: 1}
    {id: 40, replyTo: 1}
];

我想从该数组中删除属性ID为1的所有对象,但也要删除1的回复。

我试过这样的事情:

for (var i = 0; i < messages.length; i++) {
    if (messages[i].id === 1 || messages[i].replyTo === 1) {
        messages.splice(i, 1);
    }
}

这不起作用。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

像这样使用filter

var filteredMessages = messages.filter(function(message) {
    return message.id !== 1 || message.replyTo !== 1;
});

答案 1 :(得分:0)

您可以使用filter方法。 在第一次过滤删除所有具有属性id 1的元素时,在第二轮中删除带有replyTo的元素是1

var messages = [
    {id: 1, replyTo: null},
    {id: 5, replyTo: null},
    {id: 7, replyTo: null},
    {id: 9, replyTo: 7},
    {id: 10, replyTo: null},
    {id: 12, replyTo: 1},
    {id: 16, replyTo: 1},
    {id: 20, replyTo: 1},
    {id: 24, replyTo: 1},
    {id: 28, replyTo: 1},
    {id: 32, replyTo: 1},
    {id: 36, replyTo: 1},
    {id: 40, replyTo: 1}
];
var newArray = messages.filter(function(item){
  return item.id !==1 
})

var newArray2 = newArray.filter(function(item){
return item.replyTo !==1;
})
console.log(newArray2);

选中此jsFiddle