如何在分区列表的每个对象中创建具有新键的对象的新数组



我有一些功能需要开发。

我有一个包含任务的数据数组。每个任务都有taskEndDate键,其值格式为(YYYY-MM-DD(,看起来像:

[
{
"id": "1616193050660",
"isExpired": false,
"isFinished": false,
"subTasks": [
"Voda redbull ",
"Wiskey Coca-Cola "
],
"taskCreationDate": "2021-Jun-12",
"taskEndDate": 2021-Jun-15,
"taskTitle": "Drink somethig",
"taskType": "BAR"
},
{
"id": "1616193050660",
"isExpired": false,
"isFinished": false,
"subTasks": [
"Voda redbull ",
"Wiskey Coca-Cola "
],
"taskCreationDate": "2021-Jun-12",
"taskEndDate": 2021-Jun-15,
"taskTitle": "Drink somethig",
"taskType": "BAR"
},
{
"id": "1616193050660",
"isExpired": false,
"isFinished": false,
"subTasks": [
"Voda redbull ",
"Wiskey Coca-Cola "
],
"taskCreationDate": "2021-Jun-13",
"taskEndDate": 2021-Jun-18,
"taskTitle": "Drink somethig",
"taskType": "BAR"
}
]

我需要创建一个新的对象数组,该数组将采用下一种格式。

newArray = [{
title: taskEndDate,
data: all tasks that contain same taskEndDate as title
}];

正如您所看到的,taskEndDate在少数任务中可以是相同的值,所以我不会每次都渲染标题,而是只渲染一次。

目前,我正在进行硬编码,然后将sortedData放入<SectionList/>:

const sortedData = [
{
title: 'Previous',
data: data.filter((task) => moment().format('YYYY-MM-DD') > moment(task.taskEndDate).format('YYYY-MM-DD')),
},
{
title: `Today - ${moment().format('MMMM-DD')}`,
data: data.filter((task) => moment().format('YYYY-MM-DD') === moment(task.taskEndDate).format('YYYY-MM-DD')),
},
{
title: 'Tomorrow',
data: data.filter((task) => moment().add(1, 'd').format('YYYY-MM-DD') === moment(task.taskEndDate).format('YYYY-MM-DD')),
},
{
title: moment().add(2, 'd').format('YYYY-MM-DD'),
data: data.filter((task) => moment().add(2, 'd').format('YYYY-MM-DD') === moment(task.taskEndDate).format('YYYY-MM-DD')),
},
{
title: 'Future',
data: data.filter((task) => moment().add(2, 'd').format('YYYY-MM-DD') < moment(task.taskEndDate).format('YYYY-MM-DD')),
},
];

如何在所有日期都通用?

让我们考虑数据数组按taskEndDate排序,然后我们可以实现按taskEndDate分组数据,如下所示:

const data = [{..}, {...}] // data array sorted by `taskEndDate`. If not needs to sort the array by taskEndDate before running the forEach loop
let sortedData = []
let length = 0 // length of sortedData
data.forEach(task => {
if(sortedData[length - 1] && task.taskEndDate === sortedData[length - 1].title){
sortedData[length - 1].data.push(task);
}
else{
sortedData.push({title: task.taskEndDate, data: [task] })
++length;
}
})
console.log(sortedData)

输出:

[
{
title: '2021-Jun-15',
data: [
{
id: '1616193050660',
...,
taskCreationDate: '2021-Jun-12',
taskEndDate: '2021-Jun-15',
},
{
id: '1616193050660',
...,
taskCreationDate: '2021-Jun-12',
taskEndDate: '2021-Jun-15',
}
]
},
{
title: '2021-Jun-18',
data: [
{
id: '1616193050660',
...,
taskCreationDate: '2021-Jun-13',
taskEndDate: '2021-Jun-18',
}
]
}
]

我不确定这是否是您想要的。如果这是你想要的,请告诉我。

const data = [
{
id: "1616193050660",
isExpired: false,
isFinished: false,
subTasks: ["Voda redbull ", "Wiskey Coca-Cola "],
taskCreationDate: "2021-Jun-12",
taskEndDate: "2021-Jun-15",
taskTitle: "Drink somethig",
taskType: "BAR",
},
{
id: "1616193050660",
isExpired: false,
isFinished: false,
subTasks: ["Voda redbull ", "Wiskey Coca-Cola "],
taskCreationDate: "2021-Jun-12",
taskEndDate: "2021-Jun-15",
taskTitle: "Drink somethig",
taskType: "BAR",
},
{
id: "1616193050660",
isExpired: false,
isFinished: false,
subTasks: ["Voda redbull ", "Wiskey Coca-Cola "],
taskCreationDate: "2021-Jun-13",
taskEndDate: "2021-Jun-18",
taskTitle: "Drink somethig",
taskType: "BAR",
},
];
const sortedData = data.map((data_) => {
return {
title: data_.taskEndDate,
data: data.filter((_task) => data_.taskEndDate === _task.taskEndDate),
};
});
console.log(sortedData);

好的,我在下一个方法中修复了它:

const getSortedArrayWithTitles = () => {
if (data.length) {
let sortedArray = [
{
title: moment(data[0].taskEndDate).format(appConfig.DAYS_FORMAT),
data: data.filter((task) => moment(task.taskEndDate).format(appConfig.DAYS_FORMAT) === moment(data[0].taskEndDate).format(appConfig.DAYS_FORMAT))
}
];
for (let i = 0, j = 0; i < data.length; i++) {
if (!sortedArray[j].title.includes(moment(data[i].taskEndDate).format(appConfig.DAYS_FORMAT))) {
sortedArray.push(
{
title: moment(data[i].taskEndDate).format(appConfig.DAYS_FORMAT),
data: data.filter((task) => moment(task.taskEndDate).format(appConfig.DAYS_FORMAT) === moment(data[i].taskEndDate).format(appConfig.DAYS_FORMAT))
}
);
j++;
}
}
return sortedArray;
}
};

我确信这不是循环使用的最佳方式,但它运行良好。也许你们有更好的办法?

最新更新