假设我有一个像这样的Javascript对象:
var obj = {
prop1: {
subProp: [ 1 ]
},
prop2: {
subProp2: [ 2 ]
},
prop3: {
subProp: [ 3 ]
}
}
正如您所看到的,我有一个多维对象,其中一些子属性是相同的。我想要的是合并这些子属性并将它们收集到一个新对象中,如下所示:
var obj2 = {
subProp: [ 1, 3 ],
subProp2: [ 2 ]
}
这是最好的方法吗?我不介意使用普通的Javascript或jQuery来做到这一点。
感谢您的任何提示或建议!
答案 0 :(得分:2)
这似乎是一个非常具体的案例,它几乎肯定会更好地尝试并为此问题制定一般解决方案。但是,此代码可以满足您的需求。
function mergeSubProps(host, allowDuplicates) {
var merged = {};
// iterate over the keys of the outer object
Object.keys(host).forEach(function(outerKey) {
var property = host[outerKey];
// iterate over the keys of the inner object
Object.keys(property).forEach(function(key) {
// get the values of this key (assuming array)
var values = property[key];
merged[key] = merged[key] || [];
if(!allowDuplicates) {
// remove duplicates from the values array
values = values.filter(function(value) {
return merged[key].indexOf(value) < 0;
});
}
// add these values to the object we're merging into
merged[key] = merged[key].concat(values);
});
});
return merged;
}
编辑:添加了第二个参数,允许/禁止最终合并数组中的重复值。如果省略第二个参数,它将默认为false,并且将排除重复项。
答案 1 :(得分:0)
可能不是性能最好的代码,但是这样......
// Merge subProp arrays
for (var prop in obj) {
for (var subProp in obj[prop]) {
obj2[subProp] = obj[prop][subProp].concat(obj2[subProp] || []);
}
}
// Remove duplicates
for (var subProp in obj2) {
obj2[subProp] = obj2[subProp].filter(function (item, pos) {
return obj2[subProp].indexOf(item) == pos}
);
}
如果使用LoDash或Underscore,那么代码就会少得多。