合并对象&数组:Javascript,JQuery

时间:2012-11-08 09:45:57

标签: javascript jquery extend

说明性示例:

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>

执行此操作的最佳方式是什么?

3 个答案:

答案 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)

您只需要针对特定​​情况的自定义解决方案。

  • 合并2个没有子对象的对象(不需要递归)
  • 最终对象的数组字段长度必须相同
  • 最终对象的数组字段必须保留索引一致性
  • 最终对象的数组字段必须使用&#39; 0&#39;作为默认值

http://jsfiddle.net/8X5yB/4/

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;
}