如何将组织对象数组拆分重组为指定键值对结构的新数组
问题描述
现有如下结构的对象数组:
organisationData = [ { "id": -516538792, "label": "name", "value": "Apple", "key": "name" }, { "id": -586565959, "label": "field", "value": "IT", "key": "field" }, { "id": 2081552018, "label": "name", "value": "Microsoft", "key": "name" }, { "id": -1094152060, "label": "field", "value": "IT", "key": "field" } ]
需要将其拆分聚合,得到如下格式的新数组:
organisations = [ { "name": "Apple", "field": "IT" }, { "name": "Microsoft", "field": "IT" } ]
当前编写的代码只能生成每个键值单独为一项的数组,无法按公司主体拆分聚合为对应的对象,代码如下:
let organisationData = [.....] let organisations = []; for (org of organisationsData) { _org = []; _org[org.key] = org.value; organisations.push(_org); };
代码修改方案
你现有代码存在两个核心问题:
- 每次循环都新建了一个容器,且错用了数组
[],应该用对象{}存储单个公司的属性 - 每遍历一项就直接推入结果数组,没有把同一家公司的
name和field属性聚合到同一个对象中
可以按如下方式修改,适配你提供的按name、field成对排列的原始数据结构:
let organisationData = [/* 填入你的原始数据 */] let organisations = []; // 临时存储当前正在收集属性的公司对象 let currentOrg = {}; for (const org of organisationData) { if (org.key === 'name') { // 遇到新的公司名称,重置临时对象 currentOrg = {}; currentOrg.name = org.value; } else if (org.key === 'field') { // 补充当前公司的领域属性,收集完成后推入结果数组 currentOrg.field = org.value; organisations.push(currentOrg); } }
如果原始数据的排列顺序不固定,无法保证name在前field在后,可以采用按固定步长分组的更稳妥方案:
let organisations = []; // 每两项为一组,对应一家公司的两个属性 for (let i = 0; i < organisationData.length; i += 2) { const currentOrg = {}; // 分别给当前公司的两个属性赋值 currentOrg[organisationData[i].key] = organisationData[i].value; currentOrg[organisationData[i+1].key] = organisationData[i+1].value; organisations.push(currentOrg); }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

