繁体   English   中英

Javascript:如何重新排列json

[英]Javascript: How to rearrange a json

我希望使用javascript重新排列json。 第一个json具有一个名为ids的数组,并具有名为identifier.ididaddress列。 我想使用javascript创建一个数组,其中有一个数组以相同的identifiers.id进行分组,此数组的名称为具有一列名为identifier.id的列的identifier.id并且我想在标识符数组中包含第二个名为registrations的数组具有列ID和地址。

这是我拥有的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值,并且在此数组内部还有另一个数组来存储列ID和地址。

使用JavaScript可以吗?

如评论中所述,我将亲自使用reduce创建另一个对象,在该对象中,我将使用identifier.id作为每个对象的键,以检查ID是否已存在(以防止在每次迭代中进行find )。

然后,我将使用Object.values的数组并摆脱不想要的键:您只需要值的数组。

如果不清楚或可以改善,请随时添加任何评论!

 const 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" }]; const result = Object.values(ids.reduce((acc, item) => { const identifier = item["identifier.id"]; if(!acc[identifier]) acc[identifier] = { "identifier.id": identifier, "registrations": []}; acc[identifier].registrations.push({id: item.id, address: item.address}); return acc; }, {})); console.log(result); 

您可以使用以下rearrange功能,该功能将按指定的groupBy键将对象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. 如果密钥不存在,请使用共享密钥和共享该密钥的对象的集合创建一个新组。
  4. 将除groupBy定义的对象的所有属性复制到新对象,然后将其放入相关组。
  5. 迭代结束后,获取地图的值并将其放入要返回的新JavaScript对象的identifiers属性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM