2012-05-21 76 views
0

假设我有两个json对象,我需要合并它们。将json对象与数组合并

css: [{ 
     drag: "mode() == 'layout'", 
     ui_draggable: "mode() == 'layout'" 
}] 

css: [{ 
     someclass : true 
}] 

我想结束了:

css: [{ 
     drag: "mode() == 'layout'", 
     ui_draggable: "mode() == 'layout'", 
     someclass : true 
}] 

一些进一步审理中我想出了这个之后,但我认为我有地方一些错误或它的代码无用行。

我稍微玩了一段代码就想出了这段代码。我的需求不需要递减两个以上的级别,所以这很好。我相信它可能会有很大的改进,但它对绑定淘汰赛非常有用。下面是我如何使用它来扩展jQuery的不显眼knockoutjs

var settings = { 
     text: 'SelectedCard().CardData.Title', 
     visible: "mode() != 'edit' || !isMyCard()", 
     css: [{ drag: "mode() == 'layout'" , selectedElement: "selectedCardElement() == '_titlePreview'"}] 
    }; 
    var settings2 = 
     { 
      css: [{ drag: "mode() == 'layout'"}] 
    }; 
    var settings3 = merge(settings, settings2); 

function merge(first, second) { 

    for (var a1 in first) { 
     // if second object is null we are finished. 
     used.push(a1); 
     if (second[a1] == null) { 
      continue; 
     } else { 

      var ob2 = second[a1]; 
      if (typeof (first[a1]) != typeof (ob2)) { 
      throw new Error("conflicting properties named:" + a1); 
      } 

      if ($.isArray(first[a1])) { 

       for (var i = 0; i < ob2.length; i++) { 
        first[a1].push(ob2[i]); 
       } 

      } else { 
       // matching property. 
       return merge(first[a1], second[a1]); 
      } 
     } 
    } 
    for (var a2 in second) { 
     if (used.indexOf(a2) < 0) { 
      first[a2] = second[a2]; 
     } 
    } 
    return first; 
} 
+0

这些不是“JSON对象”。 JSON是一个字符串。这些是物体。 –

+0

https://www.google.com/search?q=javascript+objects+merge SO不是您的[个人研究助理](http://meta.stackexchange.com/a/128553/165612)。 – iambriansreed

+0

Exact Duplicate:http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically – iambriansreed

回答

3

1)要合并与单向两个对象覆盖一个例子,这将做到这一点:

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

2)要合并选择性,左右逢源:

obj1.someclass = obj2.someclass; 

- 或 -

obj2["someclass"] = obj1["someclass"]; 

在这种情况下,如果属性尚不存在于对象中,则在分配对象之前不需要定义该属性。

3)考虑使用像Underscore.js库用于执行“数组函数”与此类似:

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); 

returns [1, 2, 3, 101, 10] 

4)最后,这里有用于格式化JSON对象,数组和它们的组合强大的资源:jsonexample.com。这将有助于您进入复杂的“阵列功能”。

干杯!