拼接特定条目

时间:2018-03-18 18:02:58

标签: javascript

标题说明了一切, 我正在尝试删除特定条目,例如用户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);

3 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:1)

您在迭代数据时会从数组中删除项目,这会让迭代感到困惑:

迭代的第一步删除数组中的第一个元素,将每个剩余元素移动一个。迭代的第二步是查看数组中的第二个元素...在缩短数组之前,它曾经是第三个元素。因此,迭代器永远不会看到(原始)第二个元素。

解决这个问题的一种方法是从数组的最后开始,然后开始工作;这种方式改变数组长度并不重要,因为它们只影响你已经迭代过的元素。

&#13;
&#13;
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;
&#13;
&#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);

使用您的方法,您可以动态修改数组,从而导致不一致。