所以我有一个正在尝试深入扩展的对象 - 现在,如果最低级别只是一个数组,则扩展函数可以工作,所以它看起来像这样:
function(base, next) {
var dataEntry = base.filter(function(it) {
return it.module === next.module;
})[0];
if (dataEntry) {
var diff = next.customUrl.filter(function(it) {
return dataEntry.customUrl.indexOf(it) === -1;
});
dataEntry.customUrl = dataEntry.customUrl.concat(diff).sort();
//_.extend(dataEntry, next);
} else {
base.push(next);
}
}
如果对象看起来像:
[
{"name" : "one", "test" : ["1","2"]},
{"name" : "two", "test" : ["1","2"]}
]
但是有些事情必须改变,现在对象看起来像这样:
[
{"name" : "one", "test" : [{"random1" : true},{"random2" : false}] },
{"name" : "two", "test" : [{"random3" : true},{"random4" : false}]}
]
数组中的键现在是对象数组,并且对象键是随机的。因此,如果有一个具有相同键的对象 - 替换该值(除非它相同,否则将一个新对象插入其中。
因此,对于上面的对象,我将传递它以合并到其中,例如:
{"name" : "one", "test" : [{"random2" : true}]}
这样会将 random2 的值更改为 true,或类似的内容
{"name" : "one", "test" : [{"random18" : true}] }
这样会随机插入 18 个:
[
{"name" : "one", "test" : [{"random1" : true},{"random2" : false},{"random18" : true}] },
{"name" : "two", "test" : [{"random3" : true},{"random4" : false}]}
]
不确定如何更深地遍历并合并。感谢您的阅读!!
编辑:首先刺它 -
function(base, next) {
var dataEntry = base.filter(function(it) {
return it.module === next.module;
})[0];
if (dataEntry) {
var allTags = [];
allTags.push.apply(allTags, dataEntry.customUrl);
allTags.push.apply(allTags, next.customUrl);
dataEntry.customUrl = allTags;
} else {
base.push(next);
}
}
不起作用,因为如果对象相同,它不会覆盖它们,只是插入数组。
最佳答案
http://jsfiddle.net/p08ayvv8/
这个 fiddle 向您展示了 jQuery 如何处理(深度)扩展对象。
请参阅http://api.jquery.com/jquery.extend/以获得详细的解释。
值得注意的是,当执行第二个扩展时,jQuery 会将 test 的旧值添加到数组中,这就是我添加的原因
o1.test = o1.test[0];
关于JavaScript,深度扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28906836/