0

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

例如

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”值的子对象。

例如

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);`
4

5 回答 5

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方法来获取数组的特定元素。

于 2013-09-03T07:42:26.223 回答
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))

提琴手

于 2013-09-03T08:02:46.947 回答
0

所以..你需要克隆对象吗?

也许你可以这样尝试:

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

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

console.log(sergi);
console.log(bill);
于 2013-09-03T07:45:51.607 回答
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);
于 2013-09-03T07:47:56.313 回答
0

尝试这个:

演示

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))
于 2013-09-03T07:56:50.743 回答