如果父数组的另一个属性重复,如何将元素添加到对象数组的属性中?

时间:2019-03-30 22:16:40

标签: javascript arrays node.js ecmascript-6

所以,我有以下数组:

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'}
        ]
    }
]

2 个答案:

答案 0 :(得分:1)

您可以使用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:如前所述,请下次再分享您的尝试。

答案 1 :(得分:0)

使用Array.reduce()通过proyectId将数组转换为Map。使用[proyectId, customFields]将Map转换为条目数组(Array.from()),然后使用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);