修改对象数组-JavaScript

时间:2019-09-10 20:17:58

标签: javascript

我有一个这样的对象数组。

[
    {KEY1: "VALUE1", NAME: "VALUE2", PID: "VALUE36"}
    {KEY11: "VALUE1", NAME: "VALUE2", PID: "VALUE47"}
    {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE49"}
    {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE43"}
]

我需要这样的数据结构。因此,具有重复名称的key NAME基本上将成为新数据结构的关键。 key PID将是其在数组中的值。

[
   { VALUE2: [VALUE36, VALUE47] },
   { VALUE4: [VALUE49, VALUE43] },
]

2 个答案:

答案 0 :(得分:0)

const a = [
    {KEY1: "VALUE1", NAME: "VALUE2", PID: "VALUE36"},
    {KEY11: "VALUE1", NAME: "VALUE2", PID: "VALUE47"},
    {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE49"},
    {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE43"},
];

var b = [];
a.forEach(function(element) {
  if (b[element['NAME']] === undefined) {
    b[element['NAME']] = [];
  }
  b[element['NAME']].push(element['PID']);
});

console.log(b);

输出:

[ VALUE2: [ 'VALUE36', 'VALUE47' ], VALUE4: [ 'VALUE49', 'VALUE43' ] ]

答案 1 :(得分:0)

此类聚合由Array.reduce()处理。例如:

const arr = [
  {KEY1: "VALUE1", NAME: "VALUE2", PID: "VALUE36"},
  {KEY11: "VALUE1", NAME: "VALUE2", PID: "VALUE47"},
  {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE49"},
  {KEY11: "VALUE1", NAME: "VALUE4", PID: "VALUE43"},
]

// Objects are basically associative arrays in JS, so...
// (For each item in arr, add or update an array at obj[item.NAME])
const obj = arr.reduce((obj, item) => {
  const val = [ item.PID ]
  obj[item.NAME] = Array.isArray(obj[item.NAME])
    ? obj[item.NAME].concat(val)
    : val
  return obj
}, {}) // start with obj = {}

/*
At this point, we have
obj = {
  "VALUE2": [
    "VALUE36",
    "VALUE47"
  ],
  "VALUE4": [
    "VALUE49",
    "VALUE43"
  ]
}
*/

// ...but since you specified separate objects, this finishes it off
const newArr = Object.entries(obj).map(([key, val]) => ({ [key]: val }))
console.log(newArr)