web-dev-qa-db-ja.com

一致するプロパティを持つ配列からオブジェクトを削除するにはどうすればよいですか?

次のデータを考慮してください。

_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_に一致するorders配列から単一のアイテムを削除したい。私が試したことは次のとおりです。

_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},
_

配列から一致する要素をターゲットにし、そのsingleインスタンスを削除します。どこで私は間違えましたか?

5
anonym

Array#filtermethod

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#findIndexmethod

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

私にとっての最初のステップは、その三項演算子のような紛らわしいものとあなたの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);

Array#filterの使い方が100%わからない場合は使用しないことをお勧めします。

[〜#〜] update [〜#〜] Array#filterメソッドを使用しないと言っているわけではありません。コードが機能していない場合は、問題の原因となっている可能性のあるものをすべて削除し、単純な構造(forループやif stmtなど)を使用して、ステップごとに実行してみてください。

1
Gab

これを試して:

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);
};
1
Girisha