2016-03-23 2 views
0

を追加+マージobejct:好きな私はO(N^2)をとる、これを作成し、まずJavascriptが私はこのように、これら二つのオブジェクトの追加&をマージしようとしていたアルゴリズム

obj1 = { 
    jpg: 1, 
    gif: 3, 
} 

obj2 = { 
    jpg: 1, 
    avi: 5, 
} 

obj3 = mergeAdd(obj1, obj2); 
// obj3 = { 
// jpg: 2, 
// gif: 3, 
// avi: 5, 
// } 

を:

for (let foo in obj1) { 
    for (let bar in obj2) { 
    if (foo === bar) { 
     // Exists : Add count 
     obj1[bar] += obj2[bar]; 
    } else { 
     // Don`t Exists : Copy from obj2 
     obj1[bar] = obj2[bar]; 
    } 
    } 
} 

そして、1「新しいアイデアは、」私の心に入ってきた - ハッシュ関数を使用して:

  1. OBJ1の「キー」のハッシュ値を取得します。obj2。
  2. obj1の値 '& obj2をハッシュ値を配列のインデックスとして使用して新しい配列に追加または追加します。
  3. 新しいオブジェクトに配列を作成します。私が知りたいのは何

  1. mergeAdd(OBJ1、OBJ2)のような機能を持っている任意のライブラリはありますか?
  2. 私の '新しいアイデア'はmergeAdd(obj1、obj2)より高速ですか?
  3. mergeAddを実行する最も速いアルゴリズムは何ですか?

ありがとう!

+0

O(nlogn)。 – jmugz3

答えて

3

ソリューション:から取らhttps://jsbin.com/rogada/edit?js,console

新しいObject.assign()メソッドで簡単にこれを行うことができます線形の複雑さを伴う。

var obj1 = { jpg: 1, gif: 3, }, 
 
    obj2 = { jpg: 1, avi: 5, }, 
 
    merged = function (array) { 
 
     var r = {}; 
 
     array.forEach(function (a) { 
 
      Object.keys(a).forEach(function (k) { 
 
       r[k] = (r[k] || 0) + a[k]; 
 
      }); 
 
     }); 
 
     return r; 
 
    }([obj1, obj2]); 
 

 
document.write('<pre>' + JSON.stringify(merged, 0, 4) + '</pre>');

1

ES6を使用できますか? ES6なし

let newObj = Object.assign({}, obj1, obj2); 

var newObj = {}; 
obj1 = { 
    jpg: 1, 
    gif: 3, 
}; 

obj2 = { 
    jpg: 1, 
    avi: 5, 
}; 
Object.keys(obj1).forEach(function(k) { 
    newObj[k] = obj1[k]; 
}); 
Object.keys(obj2).forEach(function(e) { 
    newObj[e] = obj2[e]; 
}); 

作業フィドル:http://es6-features.org/#ObjectPropertyAssignment

+1

は同じ実装ではなく、OPは 'jpg == 2' – Hacketo

0

一般的な機能/再帰的なソリューションを提供します。オブジェクトの配列を取得し、それぞれを出力オブジェクトにマージします。それは他の回答と比較してどのようにパフォーマンスが良いのか分かりません。おそらくかなり悪いです。マージおよびソートするため

function addValues(obj) { 
    return function (p, c) { 
    p[c] = (p[c] || 0) + obj[c]; 
    return p; 
    } 
} 

function mergeObject(obj, out) { 
    return Object.keys(obj).reduce(addValues(obj), out); 
} 

function processArray(arr, fn, out) { 
    out = out || {}; 
    if (!arr.length) return out; 
    out = fn(arr.shift(), out); 
    return processArray(arr, fn, out); 
} 

var arr = [{ jpg: 1, gif: 3 }, { jpg: 1, avi: 5, }]; 
processArray(arr, mergeObject); // { jpg: 2, gif: 3, avi: 5 } 

DEMO

関連する問題