2017-01-26 22 views
0

は、次のデータを考えてみましょう:プロパティと一致する配列からオブジェクトを削除するにはどうすればよいですか?

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

私は配列から一致する要素を対象とし、それの単一インスタンスを削除します。どこで私は間違えましたか?

+0

あなたはすでに(私は実際にあなたのコードをテストせずにこれを言っているが、私はそれはそれが何であるかだかなり確信して)フィルタで項目を削除したので、それが配列の最初の要素を削除しています – Gab

+2

あなたはループの中で無条件に中断しており、非常に疑わしい方法で三項演算子を使用しています –

+1

@AluanHaddad私は全く同意します。それはちょうど混乱を追加しています – Gab

答えて

10

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); 
+0

フィルターはすべての要素を除外します。 1つの一致する要素だけを削除したいと思います。 – anonym

+0

'food_id'は' unique'ではないので、どの要素を削除すべきかはどのように決めますか?最初の.. 2番目の.. 3番目の?それについて考える。 – developer033

+0

もちろん、最初の。オーダー配列には{{food_id:2、table_id:5}}の複製がたくさんありますので、1つだけ削除します。出来ますか? – anonym

1

私の最初のステップは、常にその三項演算子とあなたのブレークstmtのような混乱を取り除くことです。 は、ここではそれを使用する方法を100%がわからない場合、私はアレイ#フィルタを使用しないことをお勧めします、私はそれを

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); 

をやった方法です。

UPDATE私はArray#フィルタ方法を使用しないことを言っているわけではありません。私はちょうどあなたのコードが動作していない場合は、あなたの問題の原因となる可能性のあるものを削除しようとすると簡単な構文(forループやstmtのような)を使用して段階的に行くことを試みる必要があります。

+0

ありがとう。この解決策は機能します。 – anonym

+1

フィルタを使うべきかどうかは、あなたがしようとしていることの問題ではありません。その中にアイテムを入れずに新しい配列を作成したい場合は、フィルターが適切です。 –

+1

@AluanHaddadあなたは絶対に正しいです。私が言ったことは、このような問題を解決する最も速い方法は、完全に理解できないものを排除し、基本的な構造を使って修正しようとすることだったと思います。 – Gab

0

これを試してください:あなたはArray#filter方法を使用することができます

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); 
}; 
+0

ありがとうございました。これは機能します。 – anonym

+0

貧弱なスタイルのために下げた –

+0

@AluanHaddadあなたは貧弱なスタイルを詳しく教えていただけますか? – Girisha

関連する問題