2017-10-05 8 views
1

私は以下の2つのオブジェクト配列を持っています。私はtransidが一致するarray2要素を反映するためにarray1要素を更新したいと思います。だから私の結果は、配列2の値を反映するように更新されたarray1の2つの要素、または更新された値を持つ同じ配列1を持つ新しい配列のいずれかでなければなりません。Javascriptは、一致するインデックスの別の配列に基づいて配列を更新します。

もっと現代的な構文でこれを行うにはどうすればよいでしょうか?私はいくつかのオプションを開いて比較することができます。たとえば、array1の一致するオブジェクトはarray2オブジェクトに置き換えることができます。または、array1オブジェクト内の個々の要素は、要素に対して何らかの反復処理によって更新できます。

var arra1 = [{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c979e6"), 
    "transid" : 1, 
    "acct" : "acct1", 
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"), 
    "category" : "category1", 
    "amount" : 103 
}, { 
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"), 
    "transid" : 2, 
    "acct" : "acct2", 
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"), 
    "category" : "category2", 
    "amount" : 103 
}] 

var arra2 = [{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c979e6"), 
    "transid" : 1, 
    "acct" : "acct2", 
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"), 
    "category" : "category5", 
    "amount" : 107 
}, { 
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"), 
    "transid" : 2, 
    "acct" : "acct2", 
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"), 
    "category" : "category2", 
    "amount" : 103 
}, { 
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"), 
    "transid" : 3, 
    "acct" : "acct2", 
    "transdate" : ISODate("2016-07-31T05:00:00.000Z"), 
    "category" : "category3", 
    "amount" : 103 
}] 

私はそれを少し演奏し、このようなものを今まで持っています。それは機能しませんが、それは私が探しているロジックのタイプです。

arr1.forEach(item => 
    if (arr2.indexOf(item.transid) != -1){ 
    item.category = arr2.indexOf(item.transid).category 
    } 
) 
+0

現代一致する項目を検索する方法findを使用する必要がありますか?意味は、すべてのブラウザで作業することを心配していない? – Matt

+0

はいES6。私は地元の開発と学習目的のためにそれを使用するので、大丈夫です。しかし、互換性を高めるために共有できる非ES6ソリューションは何でも自由に使えます。 –

+0

いずれかの配列にトランジションが重複する可能性はありますか?配列ごとに0または1の意味があります。配列2が3つのtransid 1を持つ場合、これによりいくつかのオプションが削除されます。 – Matt

答えて

1
arra1 = arra1.map(item => { 
    let item2 = arra2.find(i2 => i2.transid === item.transid); 
    return item2 ? { ...item, ...item2 } : item; 
}); 

のために減らします。マッピング関数でarra2に相関項目を見つけて、見つかった場合は2つの項目をオブジェクト拡散とマージして、見つからない場合は元の項目を返します。末尾にitem2を広げることはマージにとって重要なので、item2の値で上書きしますが、上書きされなかったものはitem1のままにしておきます。

1

使用arra1自体にarra1内のすべての要素を地図

let res = arr2.reduce((a,b) => { 
    let a1 = arr1.find(e => e.transid === b.transid) || {}; 
    return a.concat(Object.assign(a1, b)); 
},[]); 

console.log(res); 

let arr1 = [{ 
 
    "_id": ObjectId("583f6e6d14c8042dd7c979e6"), 
 
    "transid": 1, 
 
    "acct": "acct1", 
 
    "transdate": ISODate("2012-01-31T05:00:00.000Z"), 
 
    "category": "category1", 
 
    "amount": 103 
 
}, { 
 
    "_id": ObjectId("583f6e6d14c8042dd7c2132t6"), 
 
    "transid": 2, 
 
    "acct": "acct2", 
 
    "transdate": ISODate("2012-01-31T05:00:00.000Z"), 
 
    "category": "category2", 
 
    "amount": 103 
 
}] 
 

 
let arr2 = [{ 
 
    "_id": ObjectId("583f6e6d14c8042dd7c979e6"), 
 
    "transid": 1, 
 
    "acct": "acct2", 
 
    "transdate": ISODate("2012-01-31T05:00:00.000Z"), 
 
    "category": "category5", 
 
    "amount": 107 
 
}, { 
 
    "_id": ObjectId("583f6e6d14c8042dd7c2132t6"), 
 
    "transid": 2, 
 
    "acct": "acct2", 
 
    "transdate": ISODate("2012-01-31T05:00:00.000Z"), 
 
    "category": "category2", 
 
    "amount": 103 
 
}, { 
 
    "_id": ObjectId("583f6e6d14c8042dd7c2132t6"), 
 
    "transid": 3, 
 
    "acct": "acct2", 
 
    "transdate": ISODate("2016-07-31T05:00:00.000Z"), 
 
    "category": "category3", 
 
    "amount": 103 
 
}] 
 
// MOCK 
 
function ObjectId(i) { 
 
    return i; 
 
} 
 

 
function ISODate(i) { 
 
    return i; 
 
} 
 
// 
 
let res = arr2.reduce((a, b) => { 
 
    let a1 = arr1.find(e => e.transid === b.transid) || {}; 
 
    return a.concat(Object.assign(a1, b)); 
 
}, []); 
 

 
console.log(res);

1

あなたはES6のように

arr1.forEach(item1 => { 
     var itemFromArr2 = arr2.find(item2 => item2.transid == item1.transid); 

     if (itemFromArr2) { 
     item1.category = itemFromArr2.category; 
     } 
    } 
) 
関連する問題