2017-05-14 10 views
1

タイトルを正しく書き込む方法がわかりませんが、それを私に許してください。別の配列からオブジェクトの既存の配列に新しいプロパティを追加します

基本的に私は場所から来ているオブジェクトの配列のリストを持っています、私は一緒にマップする必要があります。下のコードをどうやって私はそれを作ることができません。

const person = [ 
 
    {name:'hello',id:1}, 
 
    {name:'javascript',id:2}, 
 
    {name:'world',id:3} 
 
]; 
 

 
const selected = [2,3]; 
 

 

 
const normalized = person.map((obj,i) => obj.id === selected[i] ? Object.assign({}, obj, {checked:true}) : obj); 
 

 
console.log(normalized)

https://jsfiddle.net/q9g0kazx/1/

私が選択したアレイに余分なプロパティベースを追加する必要があります。上記のコードがうまくいかない理由

+0

正確な予想結果とは何ですか? –

答えて

0

私が正しくあなたを理解していれば、単にforEachを使用して配列を反復処理し、必要に応じてプロパティを追加します。

const person = [ 
 
    {name: 'hello', id: 1}, 
 
    {name: 'javascript',id: 2}, 
 
    {name: 'world',id: 3} 
 
]; 
 

 
const selected = [2,3]; 
 

 
person.forEach(p => { 
 
    if (selected.includes(p.id)) { 
 
    p.checked = true; 
 
    } 
 
}); 
 

 
console.log(person);

+0

ここにどのように仕事が含まれていますか? –

+1

ここに:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/includes?v=control実際には、 'selected.indexOf (p.id)> -1' –

+0

通常、私はindexOfを使用します。もっと一般的ですが、indexOfをインクルードすることの利点は何ですか? –

0

あなたはこれを行うことができます。

チェックを配列内のidがでselected配列中に存在する場合:obj.idselected配列中に存在した場合

selected.includes(obj.id) 

だから、返しますtrueを含み。存在する場合(yes)、Object.assign部分が実行されます。

あなたのperson配列とselected配列の要素数が同じでなく、順序も同じではないため、コードが機能しなかった理由がありました。 だからperson[0]のIDが1であり、idが2のようにselected[0]と一致しません。

const person = [{ 
 
    name: 'hello', 
 
    id: 1 
 
    }, 
 
    { 
 
    name: 'javascript', 
 
    id: 2 
 
    }, 
 
    { 
 
    name: 'world', 
 
    id: 3 
 
    } 
 
]; 
 

 
const selected = [2, 3]; 
 

 
const normalized = person.map((obj, i) => selected.includes(obj.id) ? Object.assign({}, obj, { 
 
    checked: true 
 
}) : obj); 
 

 
console.log(normalized);

関連する問題