分组并合并JSON属性

时间:2015-01-06 17:47:05

标签: javascript jquery json grouping

我有一个JSON对象,它具有重复的电子邮件属性,如下所示:

accounts": [
{
  "email": "somebody@domain.com",
  "accountID": 1,
  "accountName": "Account Name",
  "permission": "Permission 1",
  "nodeID": 1
},
{
  "email": "somebody@domain.com",
  "accountID": 1,
  "accountName": "Account Name",
  "permission": "Permission 2",
  "nodeID": 2
}]

JSON包含我想要分组的重复电子邮件字段。所需的结果JSON如下:

{
  “email” : ”somebody@domain.com”, 
  “accountID” : 1,
  “accountName” : “Account Name”,
  “permissions” : [
    { 
        “permission” : “Permission 1”,
        “nodeID” : 1
    },
    { 
        “permission” : “Permission 2”,
        “nodeID” : 2
    }
  ]
}

因此,通过这种方式,生成的JSON不会包含多个具有相同电子邮件属性的项目。

有没有办法用jQuery实现这个?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用forEach循环可以非常轻松地完成此操作:



var source = {accounts: [
{
  "email": "somebody@domain.com",
  "accountID": 1,
  "accountName": "Account Name",
  "permission": "Permission 1",
  "nodeID": 1
},
{
  "email": "somebody@domain.com",
  "accountID": 1,
  "accountName": "Account Name",
  "permission": "Permission 2",
  "nodeID": 2
}]};

var groups = {};

source.accounts.forEach(function(item) {
    if (!groups.hasOwnProperty(item.email)) {
        groups[item.email] = {
            email : item.email,
            accountID : item.accountID,
            accountName: item.accountName,
            permissions: []
        };
    }
    groups[item.email].permissions.push({
        permission: item.permission,
        nodeID: item.nodeID
    });
});

alert(JSON.stringify(groups));




我们创建一个空对象,然后循环遍历原始数组。对于数组中的每个项目,我们检查是否已经收到此电子邮件,如果没有,我们会将其与accountIDaccountName一起插入到对象中,然后我们为权限创建一个空数组。然后我们只是将权限添加到数组中。

你最终得到一个看起来像这样的对象:

{
    "somebody@domain.com": {
        "email": "somebody@domain.com",
        "accountID": 1,
        "accountName": "Account Name",
        "permissions": [
            {
                "permission": "Permission 1",
                "nodeID": 1
            },
            {
                "permission": "Permission 2",
                "nodeID": 2
            }
        ]
    }
}

使用每个电子邮件地址的密钥。如果需要,可以使用for...in循环遍历它。