2016-03-23 4 views
0

Я пытался объединить & добавить эти два объекта как это:Javascript obejct слияния + добавить алгоритм

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 & obj2.
  2. Вставить или добавить 'значение' объекта obj1 & obj2 в новый массив, используя их значение хэша в качестве индекса массива.
  3. Сделать массив новым объектом.

То, что я хочу знать:

  1. Есть ли библиотека, которая имеет функцию как mergeAdd (obj1, obj2)?
  2. Является ли моя «новая идея» быстрее, чем mergeAdd (obj1, obj2)?
  3. Каков самый быстрый алгоритм для mergeAdd?

Спасибо!

+0

О (NlogN) для объединения и сортировки. – jmugz3

ответ

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

Можете ли вы использовать 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

+1

не такая же реализация, OP want '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

Смежные вопросы