JS使用Array.map()和Array.reduce()简化数组到对象转换的重组



我有一个API调用,它以这样的格式返回数据:

const testScheduleData = [
{
DATE: "2021-06-20",
SELECTED: false,
STARTINGDAY: true,
ENDINGDAY: true,
STATUS: "WORK",
COLOR: "green",
},
{
DATE: "2021-06-21",
SELECTED: false,
STARTINGDAY: true,
ENDINGDAY: true,
STATUS: "HALFDAY",
COLOR: "green",
},
];

我需要将其重组为object of objects,格式如下:

Object {
"2021-06-20": Object {
"color": "green",
"endingDay": true,
"selected": false,
"startingDay": true,
},
"2021-06-21": Object {
"color": "green",
"endingDay": true,
"selected": false,
"startingDay": true,
},

我做这件事的方法是首先将testScheduleData映射到数组(现在忽略item.STATUS(:

const datesArr = testScheduleData.map((item, index) => ({
[item.DATE]: {
startingDay: item.STARTINGDAY,
endingDay: item.ENDINGDAY,
color: item.COLOR,
selected: item.SELECTED,
},
}));

然后使用reduce从中创建一个对象:

var datesObj = datesArr(function (result, item) {
var key = Object.keys(item)[0];
result[key] = item[key];
return result;
}, {});

它返回了正确的结果,但似乎有些过头了。有没有办法简化这两个步骤?

尝试下面的代码,您只需要映射并推入对象

let obj = {}
const testScheduleData = [
{
DATE: "2021-06-20",
SELECTED: false,
STARTINGDAY: true,
ENDINGDAY: true,
STATUS: "WORK",
COLOR: "green",
},
{
DATE: "2021-06-21",
SELECTED: false,
STARTINGDAY: true,
ENDINGDAY: true,
STATUS: "HALFDAY",
COLOR: "green",
},
];
testScheduleData.map(row => {
obj[row.DATE] = row
})
console.log(obj)

您可以使用映射回调返回对[key,value],然后将Object.fromEntriesnew Map应用于结果:

datesObj = Object.fromEntries(
testScheduleData.map(it => [
it.DATE, {
startingDay: it.STARTINGDAY,
endingDay: it.ENDINGDAY,
color: it.COLOR,
selected: it.SELECTED,
}
]))

最新更新