合并两个对象中的数组值属性

时间:2015-10-25 07:24:42

标签: javascript object

我有以下JavaScript对象(new_object和old_object):

new_object:

0300 : ["297"],
0800 : ["297"],
0930 : ["293"],

old_object:

0300 : ["295", "293", "298", "297"],
0800 : ["293", "298", "297"],
0930 : ["295", "298", "293"],
1130 : ["297", "293", "298"],
1230 : ["295", "298"]

我想合并它们,以便最终对象就像

new_object['0300'].push

我为每个循环尝试了li,但它无法正常工作

我怎样才能合并JavaScript对象?有没有最好的做法?

5 个答案:

答案 0 :(得分:1)

试试这个:

for (var key in new_object){
    if(old_object.hasOwnProperty(key)){
        new_object[key] = new_object[key].concat(old_object[key]);
    } 
}

答案 1 :(得分:0)

您也可以使用jquery $.merge()

var result = $.merge(oldArray, newArray);

check this

答案 2 :(得分:0)

我认为new_object['0300'].push语法错误。 尝试new_object[0300].push。 有用。但是输出很奇怪。

var newObject = {0300 : ["295", "293", "298"],0800 : ["293", "298"],0930 : ["295"],1130 : ["297", "293", "298"],1230 : ["295"]}
var oldObject = {0300 : ["297"],0800 : ["297"],0930 : ["293"]}
newObject[0300].push(oldObject[0300])
//console outputs: ["295", "293", "298", ["297"]] 

所以我使用concat方法。

var newObject = {0300 : ["295", "293", "298"],0800 : ["293", "298"],0930 : ["295"],1130 : ["297", "293", "298"],1230 : ["295"]}
var oldObject = {0300 : ["297"],0800 : ["297"],0930 : ["293"]}

newObject[0300].concat(oldObject[0300])
//console outputs: ["295", "293", "298", "297"]

最后,合并两个Json对象。 试试这个。

并查看此问题> How can I merge properties of two JavaScript objects dynamically?

for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }

答案 3 :(得分:0)

实际上做了一个正确的解决方案......

var final_object = {};

var new_object_properties = Object.getOwnPropertyNames(new_object);
var old_object_properties = Object.getOwnPropertyNames(old_object);
var new_object_properties_length = new_object_properties.length;
var old_object_properties_length = old_object_properties.length;
if(new_object_properties_length >  old_object_properties_length)
while(--new_object_properties_length){
     var property_name = new_object_properties[new_object_properties_length];
     if(old_object[property_name])
          final_object[property_name] = new_object[property_name].concat(old_object[property_name];
     else
         final_object[property_name] = new_object_properties[new_object_properties_length];
}
else
    while(--old_object_properties_length){
     var property_name = old_object_properties[old_object_properties_length];
     if(new_object[property_name])
          final_object[property_name] = old_object[property_name].concat(new_object[property_name];
     else
         final_object[property_name] = old_object_properties[old_object_properties_length];
}

答案 4 :(得分:0)

首先,编写一个实用程序函数,根据作为函数传入的合并策略,将属性与两个对象中的相同键合并。

要将属性与两个对象中的相同键合并,我们遍历第二个键列表,并将值合并到第一个对象中(如果它具有相同键的属性),或者只是将其复制(如果它没有)。编写它的方式将改变(覆盖)o1

function merge_keys(o1, o2, merge) {
  var keys2 = Object.keys(o2), key;

  for (var i = 0; i < keys2.length; i++) {
    key = keys2[i];
    o1[key] = o1[key] ? merge(o1[key], o2[key]) : o2[key];
  }
}

定义您要使用的合并策略:

function concat(a, b) { return a.concat(b); }

然后

merge_keys(new_object, old_object, concat);

请参阅http://jsfiddle.net/hootuoph/2/

如果您使用ES6编程,可以使用for...of

更紧凑地编写
function merge_keys(o1, o2, merge) {
  for (var k of Object.keys(o2)) {
    o1[k] = o1[k] ? merge(o1[k], o2[k]) : o2[k];
  }
}

或者,如果您更喜欢使用Array#forEach

function merge_keys(o1, o2, merge) {
  function maybe_merge(k) { o1[k] = o1[k] ? merge(o1[k], o2[k]) : o2[k]; }

  Object.keys(o2).forEach(maybe_merge);
}