私は2つのコレクションを持っています。
var a =
[
{unique_id: "001", state: "CO"},
{unique_id: "001", state: "TX"},
{unique_id: "001", state: "CC"},
{unique_id: "002", state: "CC"},
{unique_id: "002", state: "NY"}
]
そして
var b =
[
{unique_id: "001", states:[]},
{unique_id: "002", states:[]}
]
そして私は取得したい:
var b =
[
{unique_id: "001", states:["CO","TX","CC"]},
{unique_id: "002", states:["CC","NY"]}
]
「b」配列は同じ順序である必要があり、unique_idの一部には値がありません。
私はLoDashhttps : //lodash.com/を使おうとしています-だから、誰かがLoDashでこれを解決できれば、それは素晴らしいことです!
このソリューションの時間計算量は最適ではありませんが(O(n ^ 2))、値を「b」にプッシュすることを一致させる方法を考えるのに役立つ場合があります。
_.forEach(a, function(element1){
_.forEach(b, function(element2){
if (element2.unique_id === element1.unique_id) {
element2.states.push(element1.state);
}
});
});
おそらく、より良い解決策は、lodashの_.indexByメソッドを使用して、b内のオブジェクトを一意のIDでインデックス付けすることです。たとえば、次のようにbのオブジェクトにインデックスを付けることができます。
var c = _.indexBy(b, 'unique_id')
その結果、次のようになります。
{001:{unique_id: "001", states:[]}, 002: {unique_id: "002", states:[]}}
c配列内のオブジェクトは、メモリ内のb配列内のオブジェクトと同じオブジェクトを指しているため、c内のオブジェクトを直接変更でき、bはメモリ内の更新されたオブジェクトを参照します。そう:
_.forEach(a, function(element1){
if (element1.unique_id in c) {
c[element1.unique_id].states.push(element1.state);
}
})
ここで、b配列を見ると、値は次のようになっていることがわかります。
var b =
[
{unique_id: "001", states:["CO","TX","CC"]},
{unique_id: "002", states:["CC","NY"]}
]
このソリューションの時間計算量はO(n)に近いはずです。これは、ネストされた_.forEachアプローチを使用するよりもはるかに優れています。コードスニペット:
var a =
[
{unique_id: "001", state: "CO"},
{unique_id: "001", state: "TX"},
{unique_id: "001", state: "CC"},
{unique_id: "002", state: "CC"},
{unique_id: "002", state: "NY"}
];
var b =
[
{unique_id: "001", states:[]},
{unique_id: "002", states:[]}
];
var c = _.indexBy(b, 'unique_id');
_.forEach(a, function(element1){
if (element1.unique_id in c) {
c[element1.unique_id].states.push(element1.state);
}
});
document.writeln(JSON.stringify(b))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.js"></script>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加