>假设我有两个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;
}
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。 当您进入复杂的"数组函数"时,这将很有帮助。
干杯!