我从firebase中提取一个对象,将其转换为数组然后对其执行remove元素操作,但是有一些奇怪的行为:
this.players = this.db.object('arena/players').valueChanges();
this.players.subscribe(players =>{
console.log(players);
this.playersarray= Object.keys(players).map(key => ({ key, value: players[key] }));
console.log(this.playersarray);
console.log(this.playersarray.length);
for(var i =0;i<this.playersarray.length;i++){
if(this.playersarray[i].value != "waiting"){
console.log(this.playersarray[i].value+"deleting");
this.playersarray.splice(i,1);
}
}
console.log(this.playersarray);
});
我正在尝试删除值等于wait的元素。所以在这种情况下我希望删除engincan,lifesuxtr并获取最后一个console.log只作为someotheruser,someuser 但是lifesuxtr没有删除???只有engincan删除?
答案 0 :(得分:1)
您可以使用Array.filter
运算符迭代数组并过滤相关结果,例如:
const arr = [1, 2, 3, 4, 5];
const result = arr.filter((item) => item % 2 === 1);
console.log(result);
&#13;
答案 1 :(得分:0)
从阵列中删除项目时,所有后续项目的索引都会向下移动。因为你要删除一个项目,所以你的循环会跳过一个项目。
// Array starts as:
// 0 1 2 3
// ['a', 'b', 'c', 'd']
// Loop 1: Index 0, item 'a'. Matches test, remove it.
// Array becomes:
// 0 1 2
// ['b', 'c', 'd']
// Loop 2: Index 1, item 'c'.
// Loop 3: Index 2, item 'd'.
最快的解决方法是通过从中减去一个来改变索引,但这很难快速跟踪。我建议使用Array.filter()方法。
this.playersarray = this.playersarray.filter(function(player) {
return player.value != 'waiting'
})
答案 2 :(得分:0)
按值删除数组元素的简单方法。
var playersarray = {
"name": "John",
"age": 30,
"cars": "Ford"
};
for(value in playersarray){
if(playersarray[value] != "Ford"){
delete playersarray[value]; //deleting array elements if no 'Ford'
}
}
console.log(playersarray);
Output: {cars:"Ford"}