说明性示例:
d1 = {
"ean_code": ["OA13233394CN08", "8903327046534", "8903327014779"],
"balance_qty": [5, 10, 15]
}
并且
d2 = {
"ean_code": ["OA13233394CN11", "OA13233394CN08", "8903327014779", "OA13233394CN09"],
"scanned_qty": [30, 5, 20, 10, - 1],
}
输出:
d3 = {
"ean_code": ["OA13233394CN08", "8903327046534", "8903327014779", "OA13233394CN11", "OA13233394CN09"],
"scanned_qty": [5, 0, 20, 30, 10],
"balance_qty": [5, 10, 15, 0, 0]
}
释即可。 d3['scanned_qty'][1]
默认值为0
,因为d3['ean_code'][1]
的值属于d1['ean_code']
数组,d1
对象没有scanned_qty
键。< / p>
执行此操作的最佳方式是什么?
答案 0 :(得分:1)
假设您分别将o1和o2作为对象1和2。
var key,
result = {}
i,
largestLength = 0,
copyIntoResult = function (obj, key) {
for (i = 0; i < obj[key].length; i += 1) {
if (result[key].indexOf(obj[key][i]) === -1) {
result[key].push(obj[key][i]);
}
}
};
for (key in o1) {
if (o1.hasOwnProperty(key) && o2.hasOwnProperty(key)) {
result[key] = [];
copyIntoResult(o1, key);
copyIntoResult(o2, key);
if (result[key].length > largestLength) {
largestLength = result[key].length;
}
} else if (o1.hasOwnProperty(key)) {
result[key] = [].concat(o1[key]);
if (o1[key].length > largestLength) {
largestLength = o1[key].length;
}
}
}
for (key in o2) {
if (o2.hasOwnProperty(key) && !result[key]) {
result[key] = [].concat(o2[key]);
if (o2[key].length > largestLength) {
largestLength = o2[key].length;
}
}
}
// result now has the merged result
for (key in result) {
if (result[key].length < largestLength) {
for (i = 0; i < (largestLength - result[key].length); i += 1) {
result[key].push('');
}
}
}
编辑:编辑问题后,通过将数组均衡到合并结果的最大数组长度,可以使所有数组的长度相同。但是,默认的“空白”条目取决于您(在这种情况下,我只使用了一个空字符串)。
答案 1 :(得分:1)
您只需要针对特定情况的自定义解决方案。
function customMerge(a, b, uniqueKey) {
var result = {};
var temp = {};
var fields = {};
// object 1
for(var x=0; x<a[uniqueKey].length; x++) {
id = a[uniqueKey][x];
if(temp[id] == null) temp[id] = {};
for(k in a) {
if(k != uniqueKey) {
fields[k] = '';
temp[id][k] = (a[k].length > x ? a[k][x] : 0);
}
}
}
// object 2
for(var x=0; x<b[uniqueKey].length; x++) {
id = b[uniqueKey][x];
if(temp[id] == null) temp[id] = {};
for(k in b) {
if(k != uniqueKey) {
fields[k] = '';
temp[id][k] = (b[k].length > x ? b[k][x] : 0);
}
}
}
// create result
result[uniqueKey] = [];
for(f in fields) result[f] = [];
for(k in temp) {
result[uniqueKey].push(k);
for(f in fields) {
result[f].push(temp[k][f] != null ? temp[k][f] : 0);
}
}
return result;
}
...
var obj = customMerge(d1, d2, "ean_code");
答案 2 :(得分:0)
function merge(a,b) {
var c = {};
for(key in a.keys()) {
c[key] = a[key].slice(0);
}
for(key in b.keys()) {
if(typeof c[key] == 'undefined') {
c[key] = b[key].slice(0);
} else {
var adds = b[key].filter(function(item){
return (a[key].indexOf(item) == -1);
});
c[key].concat(adds);
}
}
return c;
}