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

时间:2017-01-22 10:40:18

标签: javascript angular typescript

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

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

3 个答案:

答案 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;
    }