javascript - 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吗?
解决方案
您可以使用以下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'));
它的工作方式如下:
- 定义映射,其中键是
groupBy
要分组的对象中的属性值 - 遍历对象并检查键是否出现在地图中
- 如果 key 不存在,则使用共享 key 和共享它的对象集合创建一个新组。
- 复制对象的所有属性,除了在 中定义的
groupBy
,到新对象并将其放入相关组。 - 迭代结束后,获取映射的值并将它们放入
identifiers
要返回的新 JavaScript 对象的属性中。
我在您的测试对象中添加了一项以演示多个组:)
您可以在此处阅读有关Array.prototype.reduce
函数及其参数的更多信息
推荐阅读
- javascript - 重构所有 Vue 组件导入以附加 .vue 扩展名
- delphi - TIdSMTP:如何修复错误 SSL 协商失败
- node.js - 无法使用nodejs收听服务器端websocket上发出的数据
- reactjs - React Native 0.64 FBReactNativeSpec SyntaxError: Unexpected token ) PhaseScriptExecution
- node.js - 服务器发送的事件未在 Google App Engine 上发送,但在本地工作正常。如何从服务器发送多条消息?
- flutter - Dart 中的 Twitter API 2.0 Conversation_id
- javascript - Nodejs:构建以优化 .min.js 模块?
- reinforcement-learning - 线性函数逼近的特征选择
- php - WordPress重定向功能
- mongodb - 如何从实际日期开始(我的意思是今天)一直在一年前的 mongo 查询数据集?