【问题标题】:How to add elements to an object array property, if another property from the parent array is duplicated? [duplicate]如果父数组中的另一个属性重复,如何将元素添加到对象数组属性? [复制]
【发布时间】:2019-08-21 11:57:20
【问题描述】:

所以,我有以下数组:

const objectArray = [
    {
       'proyectId': 1,
       'fieldName': 'dog',
       'fieldValue': 'wof'
    },
    {
       'proyectId': 1,
       'fieldName': 'cat',
       'fieldValue': 'meow'
    }
];

我怎样才能转换成这个,例如使用 JS reduce 或类似的东西:

[
    {
        proyectId: 1,
        customFields: [
            {'fieldName':'dog', 'fieldValue': 'wof'},
            {'fieldName':'cat', 'fieldValue': 'meow'}
        ]
    }
]

【问题讨论】:

  • 请分享您的尝试。
  • 谢谢杰托!很好解决

标签: javascript arrays node.js ecmascript-6


【解决方案1】:

使用Array.reduce() 将数组转换为proyectId 的映射。使用 Array.from() 将 Map 转换为条目数组 ([proyectId, customFields]),并使用 Array.map() 将条目转换为对象格式:

const objectArray = [{"proyectId":1,"fieldName":"dog","fieldValue":"wof"},{"proyectId":1,"fieldName":"cat","fieldValue":"meow"}];

const result = Array.from(
  objectArray.reduce((r, { proyectId, ...o }) => 
    r.set(proyectId, [...r.get(proyectId)  || [], o])
  , new Map())
).map(([proyectId ,customFields]) => ({
  proyectId,
  customFields
}));

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用 Array.reduce 通过键 (proyectId) 为对象建立索引,然后使用 Object.values 单独检索值:

    const input = [{'proyectId': 1, 'fieldName': 'dog', 'fieldValue': 'wof'}, {'proyectId': 1, 'fieldName': 'cat', 'fieldValue': 'meow'}];
    
    const result = Object.values(input.reduce((map, {proyectId, ...fields}) => {
      map[proyectId] = map[proyectId] || {proyectId, customFields: []};
      map[proyectId].customFields.push(fields);
      return map;
    }, {}));
    
    console.log(result);

    PS:请按照之前的建议,下次先分享您的尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 2021-11-09
      • 2015-04-27
      • 1970-01-01
      • 2023-04-01
      • 2017-10-13
      • 2019-08-21
      • 2016-07-10
      相关资源
      最近更新 更多