使用动态键将对象数组转换为新数组

时间:2019-02-08 14:13:41

标签: javascript arrays json object

我的返回数组有如下输出:

[{
    SENIORS: "SINGLE_MAN",
    age: "U21",
    fullName: "John Doe",
    personId: "0001337"
}]

我需要将其返回一种新格式,在该格式中,我需要将上述值添加到新键中,其中某些键嵌套得与下面的结构完全相同。

[
    {
    "personId": "0001337",
    "Groups": [
        {
        "group":"SENIORS",
        "status" :"SINGLE_MAN"
        }
    ]
    }
]

如您所见,我创建了一个名为“组”的新密钥,并在此组和状态中创建了2个新密钥。不确定如何最好地创建密钥,同时将旧值分配给它们。高级人员的原始密钥现在必须是组的属性。

我正在使用lodash吗?

2 个答案:

答案 0 :(得分:2)

如果它始终具有四个属性,而只有其中一个是动态的,则可以使用扩展语法隔离动态属性。然后像这样使用Object.entriesmap

const input = [{
  SENIORS: "SINGLE_MAN",
  age: "U21",
  fullName: "John Doe",
  personId: "0001337"
},
{
  JUNIORS: "SINGLE_WOMAN",
  age: "U22",
  fullName: "Jane Doe",
  personId: "0001338"
}]

const output = input.map(({ personId, fullName, age, ...rest}) => {
  const [group, status] = Object.entries(rest)[0];
  return { personId, Groups: [{ group, status }] }
})

console.log(output)

答案 1 :(得分:1)

即使没有破折号,您也可以很容易地对数据进行整形。还要假设我们事先知道组名。

let a = [{
    SENIORS: "SINGLE_MAN",
    age: "U21",
    fullName: "John Doe",
    personId: "0001337"
}];

let groupNames = ["SENIORS"];

console.log("Input: ", a);

let output = a.map(row => {
    let r = { personId: row.personId };
    r.Groups = groupNames
       .filter(value => Object.keys(row).indexOf(value) !== -1)
       .map(group => {return {group: group, status: row[group]}});

    return r;
});

console.log("Output: ", output);