我正在尝试从orders[]
数组中删除函数参数中提供的tableNumber
与table_id匹配的项目。
orders = [
{food_id: 5, table_id: 1},
{food_id: 5, table_id: 2},
{food_id: 5, table_id: 1},
{food_id: 5, table_id: 1},
{food_id: 5, table_id: 2},
{food_id: 5, table_id: 3},
];
removeAllOrdersForTable(tableNumber: Table): void
{
for (let order of this.orders) {
let match = (order.table_id == tableNumber);
match ? this.orders.splice(this.orders.indexOf(order), 1) : null;
}
}
如果我执行removeAllOrdersForTable(1),它仍会在orders[]
数组中留下一些项目,其中table_id
为1.当我在执行函数后调试console.log(orders)时,我仍然得到类似的东西以下内容:
Array[1]
0: Object {food_id: 5, table_id: 1},
1: Object {food_id: 3, table_id: 1},
这是从数组中删除与对象属性值匹配的多个对象的适当方法吗?
答案 0 :(得分:3)
当您在同一个数组上有一个循环时删除项目时,将会有循环中跳过的项目。
为什么不使用filter
?它可以满足您的需求,您可以将结果分配回this.items
:
removeAllOrdersForTable(tableNumber: Table): void
{
this.orders = this.orders.filter(order => order.table_id == tableNumber);
}
filter
方法创建一个包含匹配项的新数组。通过将结果分配回this.orders
,您可以通过匹配数组替换原始数组。
如果您需要this.orders
数组来保留其原始引用,那么您只需使用splice
一次,即删除所有原始元素并插入过滤器匹配。但是,只有在前一个方法由于代码中的其他依赖项而无效时才执行此操作:
removeAllOrdersForTable(tableNumber: Table): void
{
this.orders.splice(0, this.orders.length,
...this.orders.filter(order => order.table_id == tableNumber);
}
答案 1 :(得分:1)
尝试使用此
var _orders = this.orders.slice();
for (let order of _orders) {
if(order.table_id == tableNumber){
var index = this.orders.indexOf(order);
this.orders.splice(index, 1);
}
}
答案 2 :(得分:1)
var newArray = this.orders.slice();
for (let order of newArray) {
let match = (order.table_id == tableNumber);
match ? this.orders.splice(this.orders.indexOf(order), 1) : null;
}