gpt4 book ai didi

javascript - 为什么 splice 方法不从数组中删除具有匹配属性值的所有项目?

转载 作者:行者123 更新时间:2023-11-28 13:11:53 24 4
gpt4 key购买 nike

我正在尝试从 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},

这是从数组中删除与对象属性值匹配的多个对象的适当方法吗?

最佳答案

当您在同一数组上有循环时删除项目时,循环中将会跳过一些项目。

为什么不使用过滤器?它可以满足您的需要,您可以将结果分配回 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);
}

关于javascript - 为什么 splice 方法不从数组中删除具有匹配属性值的所有项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com