首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并对象&数组: Javascript,JQuery

问合并对象&数组: Javascript,JQuery
EN

Stack Overflow用户
提问于 2012-11-08 09:45:57
回答 3查看 1.1K关注 0票数 3

示例:

代码语言:javascript
复制
d1 = {
  "ean_code": ["OA13233394CN08", "8903327046534", "8903327014779"],
  "balance_qty": [5, 10, 15]
}

和

代码语言:javascript
复制
d2 = {
  "ean_code": ["OA13233394CN11", "OA13233394CN08", "8903327014779", "OA13233394CN09"],
  "scanned_qty": [30, 5, 20, 10, - 1],
}

输出:

代码语言:javascript
复制
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键。

最好的方法来做这个手术?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-08 13:14:28

您只需要为您的特定情况提供自定义解决方案。

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

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

代码语言:javascript
复制
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");
票数 1
EN

Stack Overflow用户

发布于 2012-11-08 09:56:32

让我们假设o1和o2分别作为对象1和对象2。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-11-08 13:58:44

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13286418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档