分组并合并 JSON 属性

Group and merge JSON properties

我有一个 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 将不会包含超过 1 个具有相同电子邮件属性的项目。

有什么方法可以用 jQuery 实现吗?

提前致谢。

这可以通过 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 循环遍历它。