3

说明性示例:

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,因为 is 的值d3['ean_code'][1]属于d1['ean_code']数组且d1对象没有scanned_qty键。

执行此操作的最佳方法?

4

3 回答 3

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('');
        }
    }
}

编辑:对您的问题进行编辑后,您可以通过将数组与合并结果的最大数组长度相等来使所有数组的长度相同。但是,默认的“空白”条目取决于您(在这种情况下,我只使用了一个空字符串)。

于 2012-11-08T09:56:32.383 回答
1

您只需要针对您的特定案例的定制解决方案。

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

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");
于 2012-11-08T13:14:28.157 回答
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;
}
于 2012-11-08T13:58:44.273 回答