首页 > 解决方案 > Javascript:如何重新排列 json

问题描述

我希望使用 javascript 重新排列 json。第一个 json 有一个名为 ids 的数组,并有名为identifier.id,id和的列address。我想使用javascript创建一个数组,其中有一个数组按相同的identifiers.id分组,这个数组的名称是标识符,其中有一个名为的列identifier.id,我想在标识符数组中包含第二个名为registrations的数组,其中有列身份证和地址。

这是我拥有的json:

"ids": [
{
  "id": "27675548",
  "identifier.id": "156473847",
  "address": "Rua Brasilia, 23232, Sao Benedito - BH"
},
{
  "id": "27675569",
  "identifier.id": "156473847",
  "address": "Rua Brasilia, 11, Sao Benedito - BH"
}

这是我想要实现的 json:

 "identifiers":[
{
  "identifier.id":"156473847",
  "registrations":[
    {
      "id": "27675548",
      "address": "Rua Brasilia, 23232, Sao Benedito - BH"
    },
    {
      "id": "27675569",
      "address": "Rua Brasilia, 11, Sao Benedito - BH"
    }
    ]
}

如您所见,第一个 json 有两个位置,但是这两个位置显示了相同的 identifier.id 值,第二个 json 将相同的 identifier.id 值分组在一个数组中,并且在这个数组中还有其他数组来存储列身份证和地址。

这可能使用Javascript吗?

标签: javascriptjson

解决方案


您可以使用以下rearrange函数按指定groupBy键将对象分组到指定集合中collectionName

function rearrange(data, groupBy, collectionName) {
    return { 
        identifiers: Object.values(data.ids.reduce((acc, cur) => {
            if(!acc[cur[groupBy]]) {
                acc[cur[groupBy]] = {
                    [groupBy]: cur[groupBy],
                    [collectionName]: []
                }
            }
            const obj = Object.assign({}, cur);
            delete obj[groupBy]
            acc[cur[groupBy]][collectionName].push(obj);
            return acc;
        }, {}))
    };
}

const data = {
    "ids": [
        {
          "id": "27675548",
          "identifier.id": "156473847",
          "address": "Rua Brasilia, 23232, Sao Benedito - BH"
        },
        {
          "id": "27675569",
          "identifier.id": "156473847",
          "address": "Rua Brasilia, 11, Sao Benedito - BH"
        },
        {
          "id": "27675561",
          "identifier.id": "156473848",
          "address": "Rua Brasilia, 12, Sao Benedito - XX"
        }
    ]
};

console.log(rearrange(data, 'identifier.id', 'registrations'));

它的工作方式如下:

  1. 定义映射,其中键是groupBy要分组的对象中的属性值
  2. 遍历对象并检查键是否出现在地图中
  3. 如果 key 不存在,则使用共享 key 和共享它的对象集合创建一个新组。
  4. 复制对象的所有属性,除了在 中定义的groupBy,到新对象并将其放入相关组。
  5. 迭代结束后,获取映射的值并将它们放入identifiers要返回的新 JavaScript 对象的属性中。

我在您的测试对象中添加了一项以演示多个组:)

您可以在此处阅读有关Array.prototype.reduce函数及其参数的更多信息


推荐阅读