2017-07-09 1 views
2

以下は私の作業コードの例ですが、問題は私が100kを超えるレコードがあるときです。このスクリプトは実行に非常に時間がかかっています。オブジェクトの2つの配列を比較し、2つ目のオブジェクトの値を更新します。非常に遅い

注:私はオブジェクトの2つの配列を持っており、最初のものに基づいて2番目の配列のオブジェクト名を設定する必要があります。 IDは2つの間で一致し、順序はランダムになります。

const _ = require('lodash'); 

let res1 = [ 
    {id:1, name:'Sandra'}, 
    {id:2, name:'Bill'}, 
    {id:3, name:'Peter'}, 
    {id:4, name:'Jill'} 
]; 

let res2 = [ 
    {id:2, name:'John'}, 
    {id:4, name:'Bobby'} 
]; 

_.forEach(res1, function(data1) { 
    _.forEach(res2, function(data2) { 
    if (data1.id === data2.id) { 
     data2.name = data1.name; 
    } 
    }); 
}); 

// res2 = [{id:2, name:'bill'},{id:4, name:'Jill'}]; 
+0

迅速かつ小さな改善、あなたの戦略は、より良いそして、M×N個のループを使用する場合forループを使用して操作。 –

答えて

1

res1のidでマップを作成し、第二の配列を反復処理よりも、あなたがres1mapを見つける各IDの名前を置き換えます。

const res1 = [ 
 
    {id:1, name:'Sandra'}, 
 
    {id:2, name:'Bill'}, 
 
    {id:3, name:'Peter'}, 
 
    {id:4, name:'Jill'} 
 
]; 
 

 
const res2 = [ 
 
    {id:2, name:'John'}, 
 
    {id:4, name:'Bobby'} 
 
]; 
 

 
const res1Map = _.keyBy(res1, 'id'); 
 

 
res2.forEach((o) => res1Map[o.id] && (o.name = res1Map[o.id].name)); 
 

 
console.log(res2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+1

良い! Thumbs up(y)は、パフォーマンスを少し向上させるために 'o.name =(res1Map [o.id] || o).name'を実行する方が良いと考えていましたか? –

+0

@KoushikChatterjee - 良いアイデア。私はどれだけのパフォーマンスが得られるかはわかりませんが、もしそれがプロファイルであれば歓迎します:) –

+1

ええ、肯定的なケースのほとんどは、割り当てが必要な場合は、フェッチしません。値をキーを2回使用します。大部分のケースがネガティブである場合、これを使用して同じ名前を何度も何度も割り当てる必要はありません。 –

0

forEachfindを使用して簡単な解決策:

let res1 = [ 
 
    {id:1, name:'Sandra'}, 
 
    {id:2, name:'Bill'}, 
 
    {id:3, name:'Peter'}, 
 
    {id:4, name:'Jill'} 
 
]; 
 

 
let res2 = [ 
 
    {id:2, name:'John'}, 
 
    {id:4, name:'Bobby'} 
 
]; 
 

 
res2.forEach((item) => { 
 
    item.name = res1.find((person) => person.id === item.id).name 
 
}); 
 

 
console.log(res2);

関連する問題