2017-09-20 18 views
1

2つのオブジェクトを結合しようとしていますが、X個の重複したアイテムが存在する可能性があります。 例として、私はすでにhistoryExistingを持っており、historyNewを追加したいと思います。あなたが見ることができるように、結果はまだタイムスタンプ順に保たれているが、任意の重複があり望ましい結果重複したコンテンツのない2つのオブジェクトをマージする

var history = { 
    '1505845390000': 295426, 
    '1505757979000': 4115911, 
    '1505677767000': 4033384, 
    '1505675472000': 4033384, 
    '1505591090000': 3943956, 
    '1505502071000': 3848963, 
    '1505499910000': 3848963, 
    '1505499894000': 3848963 
} 

重複がある

サンプルデータ

var historyExisting = { 
    '1505845390000': 295426, 
    '1505757979000': 4115911, 
    '1505677767000': 4033384, 
    '1505675472000': 4033384, 
    '1505591090000': 3943956 
} 

var historyNew = { 
    '1505675472000': 4033384, 
    '1505591090000': 3943956, 
    '1505502071000': 3848963, 
    '1505499910000': 3848963, 
    '1505499894000': 3848963 
    } 

を見ることができます削除されました。 私はhistoryExistingの最後のアイテムキー/値を取得しようとしていましたが、historyNewでそのアイテムを削除してからマージしますが、非常に厄介なようです。

これはノード内のサーバー側であり、ブラウザに依存しません。

提案がありますか? Object.assignを使用して

+2

"結果はタイムスタンプ順に保持されます" - >オブジェクト順序はありません – juvian

+0

オブジェクトは何らかの重複したプロパティを持つことはできません。したがって、そのような細かいことをすべて行う必要はありません。 – trincot

答えて

2

(アップNode.jsの4でサポートされていると)

var historyExisting = { 
 
    '1505845390000': 295426, 
 
    '1505757979000': 4115911, 
 
    '1505677767000': 4033384, 
 
    '1505675472000': 4033384, 
 
    '1505591090000': 3943956 
 
} 
 

 
var historyNew = { 
 
    '1505675472000': 4033384, 
 
    '1505591090000': 3943956, 
 
    '1505502071000': 3848963, 
 
    '1505499910000': 3848963, 
 
    '1505499894000': 3848963 
 
} 
 

 
var merged = Object.assign({}, historyExisting, historyNew); 
 

 
console.log(merged);

その他のオプション:

ブラウザをサポートする必要がある場合(または環境)、Object.assignをサポートしていない場合は、jQueryの拡張またはlodashの拡張および他の多くのポリフィル。あなたがそのようなツールへのアクセス権を持っていない場合、あなたは常に自分自身を書くことができます。

function extend(base, ...objs) { 
 
    objs.forEach(obj => { 
 
    Object.keys(obj).forEach(key => { 
 
     base[key] = obj[key]; 
 
    }) 
 
    }); 
 
    return base; 
 
} 
 

 
var historyExisting = { 
 
    '1505845390000': 295426, 
 
    '1505757979000': 4115911, 
 
    '1505677767000': 4033384, 
 
    '1505675472000': 4033384, 
 
    '1505591090000': 3943956 
 
} 
 

 
var historyNew = { 
 
    '1505675472000': 4033384, 
 
    '1505591090000': 3943956, 
 
    '1505502071000': 3848963, 
 
    '1505499910000': 3848963, 
 
    '1505499894000': 3848963 
 
} 
 

 
var merged = extend({}, historyExisting, historyNew); 
 

 
console.log(merged);

+1

注:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign。これは古いブラウザでは実装されていないため、ブラウザのバージョン間の実装を確認してください。 – ryan0319

+0

もちろん、引数を広げると、 'Object.assign'もあります。 –

0

spread propertiesの使用:

const history = {...historyExisting, ...historyNew}; 

オブジェクト `とほとんど同一であります.assign({}、ノードやほとんどのブラウザでこれを動作させるには、トランジリエートする必要があります。

関連する問題