标题说明了一切, 我正在尝试删除特定条目,例如用户ID为1的条目。
我已经制作了一个JSFiddle来说明它是如何工作的,因为某些原因并不是每条消息都会被移除,但总会留下一条消息。
var messages = [
{
user:1,
message:'hello'
},
{
user:1,
message:'hello'
},
{
user:1,
message:'hello'
}
];
messages.forEach(function(message, index){
console.log(message.message);
if(message.user === 1){
console.log('remove this message!');
messages.splice(index, 1);
}
});
console.log(messages);
答案 0 :(得分:2)
最好的方法是使用 filter
:
var messages = [{ user: 1, message: 'hello' }, { user: 1, message: 'hello' }, { user: 3, message: 'hello' }],
result = messages.filter(({user}) => user !== 1);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

您使用splice
函数的方法:
问题在于您使用 splice
函数对数组应用的修改,也修改了该数组的长度。
另一种方法是使用for-loop
降低索引。
var messages = [{ user: 6, message: 'hello' },{ user: 1, message: 'hello' }, { user: 3, message: 'hello' }, { user: 1, message: 'hello' }, { user: 4, message: 'hello' }];
for (var i = 0; i < messages.length; i++) {
if (messages[i].user === 1) messages.splice(i--, 1);
}
console.log(messages);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
您在迭代数据时会从数组中删除项目,这会让迭代感到困惑:
迭代的第一步删除数组中的第一个元素,将每个剩余元素移动一个。迭代的第二步是查看数组中的第二个元素...在缩短数组之前,它曾经是第三个元素。因此,迭代器永远不会看到(原始)第二个元素。
解决这个问题的一种方法是从数组的最后开始,然后开始工作;这种方式改变数组长度并不重要,因为它们只影响你已经迭代过的元素。
var messages = [
{
user:1,
message:'A'
},
{
user:1,
message:'B'
},
{
user:1,
message:'C'
}
];
for (var i=messages.length-1; i>-1; i--) {
var message = messages[i];
if(message.user === 1){
console.log('remove this message!');
messages.splice(i, 1);
}
}
console.log(messages);
&#13;
答案 2 :(得分:0)
var messages = [
{
user:1,
message:'hello'
},
{
user: 2,
message:'hello'
},
{
user: 3,
message:'hello'
}
];
var newMessages = messages.filter(message => message.user !== 1);
console.log(newMessages);
使用您的方法,您可以动态修改数组,从而导致不一致。