如何将JavaScript数组转换为特定的对象列表

4

我有一个类似以下的数组:

[
  { "empName": "Sushant", "departments": ["HR","DEV"] },
  { "empName": "Prashant", "departments": ["HR","MNGT"] }
];

我想把这个数组转换成:
[
 { "Sushant": "HR", "Prashant":"HR" },
 { "Sushant": "DEV", "Prashant":"MNGT" }
]

我已经尝试过使用for循环和Object.values

var data =     [
      { "empName": "Sushant", "departments": ["HR","DEV"] },
      { "empName": "Prashant", "departments": ["HR","MNGT"] }
    ];

for (var i = 0; i < data.length; i++) {
    var obj = Object.values(data[i]);
    console.log(obj)
}


1
你如何分配它们?根据什么标准? - Just code
2
你确定期望输出确实是你想要的吗?我对此感到毫无头绪... - Shidersz
是的!根据员工姓名,他们有各自的部门。 - Prashant Pimpale
如果你需要根据员工姓名获取相应的部门,那么你的结果数组应该是这样的: [ { "Sushant" : [ "HR" , "DEV" ] } , { "Prashant" : [ "HR" , "MNGT" ] } ] - Karthikeyan
3个回答

10

你可以使用 reduce 遍历,并在遍历过程中将内容添加到正确索引的对象中。类似于以下代码:

let arr = [{ "empName": "Sushant", "departments": ["HR","DEV"] },{ "empName": "Prashant", "departments": ["HR","MNGT"] }];

let a = arr.reduce((arr, {empName, departments}) => {
    departments.forEach((dept, i) => {
        arr[i] = Object.assign({[empName]: dept}, arr[i])
    })
    return arr
}, [])
console.log(a)


1

您可以使用两个嵌套的forEach循环来实现另一种方法。此外,我已扩展数据集以尝试处理异常情况。

const data = [
    {"empName": "Sushant", "departments": ["HR","DEV"]},
    {"empName": "Prashant", "departments": ["HR","MNGT"]},
    {"empName": "Bob", "departments": ["ARTIST"]},
    {"empName": "Kevin", "departments": ["DEV", "MNGT", "HR"]},
    {"empName": "Alex", "departments": []},
    {"empName": "Mark"},
    {}
];

let output = [];

data.forEach((o, i) =>
{
    o.departments && o.departments.forEach((d, j) =>
    {
        output[j] = output[j] || {};
        output[j][[o.empName]] = d;
    });
});

console.log(output);

然而,这对我来说仍然没有太多意义,我会选择类似这样的东西:

const data = [
    {"empName": "Sushant", "departments": ["HR","DEV"]},
    {"empName": "Prashant", "departments": ["HR","MNGT"]}
];

let output = data.reduce((res, {empName, departments}) =>
{
    res[[empName]] = departments;
    return res;
}, {});

console.log(JSON.stringify(output));

// And you will have instant access to all the departments of a particular employee.

console.log("Deparments of Sushant: ", JSON.stringify(output.Sushant));
console.log("Deparments of Prashant: ", JSON.stringify(output.Prashant));


1

这不像 @Mark Meyer 以简洁深入的方式(高级方式)所写的内容。

我为那些不熟悉reduce()等内容但使用数组方法如reduce()真的很好,可以节省时间。

这里是使用循环的代码,我不建议您使用这个,因为这是针对那些想要使用循环、if-else等概念并且有时间编写/思考的情况。

let arr = [
     { "empName": "Sushant", "departments": ["HR","DEV"] },
     { "empName": "Prashant", "departments": ["HR","MNGT"] }
];

let newArr = [];

for(let obj of arr) {
    let name = obj.empName;
    let depts = obj.departments;


    if(newArr.length == 0) {
        for(let dept of depts) {
            newArr.push({[name]: dept});
        }
    } else {
        let j =0;
        for(let dept of depts) {
            newArr[j][name] = dept;
            ++j;
        }
    }
}

console.log(newArr);
/*
    [ { Sushant: 'HR', Prashant: 'HR' },
      { Sushant: 'DEV', Prashant: 'MNGT' } ]
*/

// Pretty printing
console.log(JSON.stringify(newArr, null, 4));
/*
    [
        {
            "Sushant": "HR",
            "Prashant": "HR"
        },
        {
            "Sushant": "DEV",
            "Prashant": "MNGT"
        }
    ]
*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接