首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

一数组 中 对象属性值 雷同的 合并

2013-03-01 
一数组 中 对象属性值 相同的 合并?本帖最后由 html5cloud 于 2013-02-27 01:03:21 编辑arr [ {a:1 , b:

一数组 中 对象属性值 相同的 合并?
本帖最后由 html5cloud 于 2013-02-27 01:03:21 编辑


arr = [ {a:1 , b:1 , c:1}, {a:2 , b:1 , c:2}, {a:3 , b:3 , c:3},
           {a:1 , b:1 , c:4}, {a:5 , b:5 , c:5}]
//变成
arr = [ {a:1,2 , b:1 , c:1,2,4}, {a:3 , b:3 , c:3},  {a:5 , b:5 , c:5}]

数组arr中以属性b为基准把 
{a:1 , b:1 , c:1}{a:2 , b:1 , c:2}{a:1 , b:1 , c:4} 合并为{a:1,2 , b:1 , c:1,2,4}
[解决办法]

var unionObjectArray = function(arr, atr){
    var r = [], t = {}, x, y, z;
    for(var i = 0, il = arr.length; i < il; i++){
        t[arr[i][atr]] = t[arr[i][atr]] 
[解决办法]
 [];
        t[arr[i][atr]].push(i)
    }
    for(var p in t)if(t.hasOwnProperty(p)){
        x = {};
        for(var i = 0, il = t[p].length; i < il; i++){
            z = arr[t[p][i]];
            for(var q in z)if(z.hasOwnProperty(q)){
                x[q] = null;
            }
        }
        for(var q in x)if(x.hasOwnProperty(q)){
            y = {};
            for(var i = 0, il = t[p].length; i < il; i++){
                z = arr[t[p][i]];
                if(z[q] != null) y[z[q]] = 1;
            }
            for(var s in y)if(y.hasOwnProperty(s)){
                if(x[q] == null)x[q] = s;
                else{
                    x[q] = [x[q]];
                    x[q].push(s)
                }
            }
        }


        r.push(x)
    }
    t = x = y = z = null;
    return r;
};
//测试:
var printObjectArray = function(arr){
    var buf = [], b;
    for(var i = 0, il = arr.length; i < il; i++){
        buf.push("{");
        b = false;
        for(var p in arr[i])if(arr[i].hasOwnProperty(p)){
            if(b)buf.push(',');
            b = true;
            buf.push(p + ":" + (arr[i][p] instanceof Array ? "[" + arr[i][p] + "]" : arr[i][p]))
        }
        buf.push("}<br>")
    }
    document.write(buf.join(''));
},
arr = [ 
    {a:1 , b:1 , c:1}, 
    {a:2 , b:1 , c:2}, 
    {a:3 , b:3 , c:3},
    {a:1 , b:1 , c:4}, 
    {a:3 , b:4 , c:5}
], atrs = ['a', 'b', 'c', 'd'];

document.write("原对象数组:<br>");
printObjectArray(arr);
document.write("<br>");

for(var i = 0, il = atrs.length; i < il; i++){
    document.write("合并属性" + atrs[i] + "后:<br>");
    printObjectArray(unionObjectArray(arr, atrs[i]));
    document.write("<br>");
}

热点排行