Javascript obejct合并+添加算法

时间:2016-03-23 14:14:11

标签: javascript algorithm javascript-objects

我试图合并&像这样添加这两个对象:

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

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

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

首先,我创建了这个需要O(n ^ 2)的人:

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. 获取obj1&的'key'的哈希值OBJ2。
  2. 插入或添加obj1&的'value'使用哈希值作为数组索引的obj2到新数组。
  3. 将数组转换为新对象。
  4. 我想知道的事情:

    1. 是否有任何库具有mergeAdd(obj1,obj2)等功能?
    2. 我的'新主意'比mergeAdd(obj1,obj2)更快吗?
    3. mergeAdd最快的算法是什么?
    4. 谢谢!

3 个答案:

答案 0 :(得分:3)

具有线性复杂性的解决方案。

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 :(得分:1)

你能用ES6吗?您可以使用新的Object.assign()方法轻松完成此操作:

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

没有ES6:

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];
});

工作小提琴:https://jsbin.com/rogada/edit?js,console

取自:http://es6-features.org/#ObjectPropertyAssignment

答案 2 :(得分: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