从父级创建具有相同属性值的子对象

时间:2013-09-03 07:32:03

标签: javascript

我有一个父对象。我想从父级创建具有相同键值对的子对象。

e.g。

parentJSON = {[name:"a1",address:"b1",comp:"c1"],
              [name:"a2",address:"b2",comp:"c1"],
              [name:"a3",address:"b3",comp:"c2"],
              [name:"a4",address:"b4",comp:"c2"],
              [name:"a5",address:"b5",comp:"c2"],
              [name:"a6",address:"b6",comp:"c3"]}

现在我想创建具有相同“comp”值的子对象。

e.g。

childJSON1 = {[name:"a1",address:"b1",comp:"c1"],
              [name:"a2",address:"b2",comp:"c1"]}

childJSON2 = {[name:"a3",address:"b3",comp:"c2"],
              [name:"a4",address:"b4",comp:"c2"],
              [name:"a5",address:"b5",comp:"c2"]}

childJSON3 = {[name:"a6",address:"b6",comp:"c3"]}

这就是我试图做的一点(它会用一个指示重复次数的键来改变父对象):

parentJSON = [1,2,3,3,4,4,4,5];
var i=0, x, count, item;

while(i < parentJSON.length) {
    count = 1;
    item = parentJSON[i];
    x = i+1;

    while(x < parentJSON.length && 
            (x = parentJSON.indexOf(item, x)) != -1) {

        count += 1;
        parentJSON.splice(x,1);
    }

    parentJSON[i] = new Array(parentJSON[i],count);
    ++i;
}

console.log(parentJSON);`

5 个答案:

答案 0 :(得分:1)

首先你的json实际上是无效的。您可能有一个对象数组,但不包含包含类似数组的对象。您的数组看起来更像是对象,因为带有点的语法用于对象。我想这应该是这样的:

var parentJSON = [
    [{name:"a1",address:"b1",comp:"c1"}],
    [{name:"a2",address:"b2",comp:"c1"}],
    [{name:"a3",address:"b3",comp:"c2"}],
    [{name:"a4",address:"b4",comp:"c2"}],
    [{name:"a5",address:"b5",comp:"c2"}],
    [{name:"a6",address:"b6",comp:"c3"}]
];
var child1 = parentJSON.slice(0, 2);
var child2 = parentJSON.slice(2, 5);

您可以使用.slice方法获取数组的特定元素。

答案 1 :(得分:1)

首先你的json格式不正确,看起来应该是这样的

                   [{name:"a1",address:"b1",comp:"c1"},
                   {name:"a2",address:"b2",comp:"c1"},
                   {name:"a3",address:"b3",comp:"c2"},
                   {name:"a4",address:"b4",comp:"c2"},
                   {name:"a5",address:"b5",comp:"c2"},
                   {name:"a6",address:"b6",comp:"c3"}]

一组对象。

我的尝试,也非常易读。

var result = {};

$.each(parentJSON, function (i, item) {
    if(!result[item.comp]) {
        result[item.comp] = [];
    }

    (result[item.comp]).push(item);
});

alert(JSON.stringify(result))

JsFiddle

答案 2 :(得分:0)

那么..你需要克隆对象吗?

也许你可以尝试这样:

var sergi= {
name: "sergi",
age: 33
};

var bill = (JSON.parse(JSON.stringify(sergi)));
bill.name = "Bill";

console.log(sergi);
console.log(bill);

答案 3 :(得分:0)

parentJSON = function(){ 
    return [
        {name:"a1",address:"b1",comp:"c1"},
        {name:"a2",address:"b2",comp:"c1"},
        {name:"a3",address:"b3",comp:"c2"},
        {name:"a4",address:"b4",comp:"c2"},
        {name:"a5",address:"b5",comp:"c2"},
        {name:"a6",address:"b6",comp:"c3"}
    ];
}

childJSON1 = new parentJSON().slice(0,2);
childJSON2 = new parentJSON().slice(2,5);
childJSON3 = new parentJSON().slice(5,6);

答案 4 :(得分:0)

试试这个:

<强> DEMO

var data = [
    [{name:"a1",address:"b1",comp:"c1"}],
    [{name:"a2",address:"b2",comp:"c1"}],
    [{name:"a3",address:"b3",comp:"c2"}],
    [{name:"a4",address:"b4",comp:"c2"}],
    [{name:"a5",address:"b5",comp:"c2"}],
    [{name:"a6",address:"b6",comp:"c3"}]
];


var groups = {};

$.each(data, function(i, item) {
    var comp = item.comp;

    delete item.comp;

    if(groups[comp]) {
        groups[comp].push(item);
    } else {
        groups[comp] = [item];
    }
});

var result = $.map(data, function(group, key) {
    var obj = {};
    obj[key] = group;

    return obj;
});
alert(JSON.stringify(groups))
相关问题