如何从具有匹配属性的数组中删除对象?

时间:2017-01-26 03:15:36

标签: angular typescript ecmascript-6

考虑以下数据:

food = {
  id: 1,
  name: 'Pizza',
  price: 16
};

orders = [
  { food_id: 2, table_id: 5 },
  { food_id: 2, table_id: 5 },
  { food_id: 1, table_id: 5 },
  { food_id: 3, table_id: 5 },
  { food_id: 1, table_id: 5 }
];

我想从匹配food_id订单数组中删除单个项目。这是我试过的:

removeFoodOrder(food: Food): void {
  for (let order of this.orders) {
    let match = this.orders.filter((order) => order.food_id == food.id);
    match ? this.orders.splice(this.orders.indexOf(order), 1) : null;
    break;
  }
  console.log(this.orders);
}

如果我调用removeFoodOrder(food),它会从数组中删除第一个元素,无论我在params中传递了什么食物。

removeFoodOrder(food) 
// removes {food_id: 2, table_id: 5} (the first element)
// I want to remove {food_id: 1, table_id: 5},

我想从数组中定位匹配元素并删除它的单个实例。我哪里出错了?

3 个答案:

答案 0 :(得分:21)

您可以使用Array#filter 方法

food = {
  id: 1,
  name: 'Pizza',
  price: 16
};

orders = [
  { food_id: 2, table_id: 5 },
  { food_id: 2, table_id: 5 },
  { food_id: 1, table_id: 5 },
  { food_id: 3, table_id: 5 },
  { food_id: 1, table_id: 5 }
];

removeFoodOrder = (food: Food): void => {
  this.orders = this.orders.filter(order => order.food_id !== food.id);        
}

修改

由于您的数组允许重复元素,并且您只想删除第一个匹配项,因此您可以使用Array#findIndex 方法

const index = orders.findIndex(order => order.food_id === food.id);
orders.splice(index, 1);

答案 1 :(得分:1)

对我来说,第一步总是要删除任何令人困惑的东西,比如那个三元运算符和你的break stmt。 这就是我的做法

let food = {
  id: 1,
  name: 'Pizza',
  price: 16
}

let orders = [
    {food_id: 2, table_id: 5},
    {food_id: 2, table_id: 5},
    {food_id: 1, table_id: 5},
    {food_id: 3, table_id: 5},
    {food_id: 1, table_id: 5}
]

for (let order of this.orders) {
    if (food.id === order.food_id) {
        this.orders.splice(this.orders.indexOf(order), 1);
        break;
    }
}
console.log(this.orders);

如果您不知道100%如何使用它,我建议不要使用Array#filter。

更新我并不是说不使用Array#filter方法。我只是说,如果您的代码不起作用,您应该尝试删除可能导致您的问题的任何内容,并尝试使用简单的结构(如for循环和if stmt)一步一步地进行操作)。

答案 2 :(得分:0)

试试这个:

function removeFoodOrder(food: Food): void
{
    for (let order of this.orders) {
        if (order.food_id == food.id) {
            this.orders.splice(this.orders.indexOf(order), 1);
            break;
        }      
    }
    console.log(this.orders);
};