遍历具有嵌套数组的对象数组并设置特定值
Iterating through an array of objects with nested arrays and setting a specific value
使用下面的对象结构数组,我需要一种扫描此数组中所有对象元素的方法,即从星期一到星期日,如果满足以下条件,请将 weeklyFlag
重置为 false,即:
weeklyFlag is true
weeklyStartTime is null
weeklyEndTime is null
然后重置weeklyFlag to false
因此,在下面的示例中使用上述条件,在满足上述条件的任何地方,我需要将该特定数组对象的 weeklyFlag
重置为 false。
所以这意味着星期一、星期二的 startEnd[1]
索引和星期六。
let weeklyTimes = [
{
"day": "Monday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Tuesday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Thursday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Saturday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Sunday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
}
];
我正在查看嵌套的 for 循环,但不确定是否可以使用数组映射或过滤器?
然后使用嵌套地图检查您的条件,如果满足则更新 weeklyFlag
。
weeklyTimes = weeklyTimes.map((day) => {
day.startEnd = day.startEnd.map(
({ weeklyFlag, weeklyStartTime, weeklyEndTime }) => {
if (weeklyFlag && !weeklyStartTime && !weeklyEndTime) weeklyFlag = false;
return { weeklyFlag, weeklyStartTime, weeklyEndTime };
}
);
return day;
});
映射的时候一定要return新的元素,你可以像我一样把新的值赋给原来的对象,或者新建一个对象。
这是一个嵌套循环,我们 运行 遍历对象,然后 运行 遍历每个对象包含的数组。对于每个,我们查看每个“startEnd”数组并修改它是否符合标准。
function resetWeeklyFlag(wt) {
const shouldBeReset = se => se.weeklyFlag && se.weeklyStartTime === null && se.weeklyEndTime === null;
wt.startEnd.forEach(se => { // inner loop
if (shouldBeReset(se)) se.weeklyFlag = false;
})
}
let weeklyTimes = getWeeklyTimes();
weeklyTimes.forEach(wt => resetWeeklyFlag(wt)); // outer loop
console.log(weeklyTimes)
// return the OP data, just so we can see the answer code up front
function getWeeklyTimes() {
return [{
"day": "Monday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Tuesday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Thursday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Saturday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Sunday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
}
];
}
我认为您的代码物有所值,但由于您要求使用 for 循环方法,所以我会使用:
const weeklyTimes = getWeeklyTimes();
for (day of weeklyTimes) {
for (s of day.startEnd) {
if (s.weeklyFlag && !s.weeklyStartTime && !s.weeklyEndTime) {
s.weeklyFlag = false;
}
}
}
console.log(JSON.stringify(weeklyTimes, null, 2));
function getWeeklyTimes() {
return [{
"day": "Monday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Tuesday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Thursday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Saturday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Sunday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
}
];
}
使用下面的对象结构数组,我需要一种扫描此数组中所有对象元素的方法,即从星期一到星期日,如果满足以下条件,请将 weeklyFlag
重置为 false,即:
weeklyFlag is true
weeklyStartTime is null
weeklyEndTime is null
然后重置weeklyFlag to false
因此,在下面的示例中使用上述条件,在满足上述条件的任何地方,我需要将该特定数组对象的 weeklyFlag
重置为 false。
所以这意味着星期一、星期二的 startEnd[1]
索引和星期六。
let weeklyTimes = [
{
"day": "Monday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Tuesday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Thursday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Saturday",
"startEnd": [
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Sunday",
"startEnd": [
{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
}
];
我正在查看嵌套的 for 循环,但不确定是否可以使用数组映射或过滤器?
然后使用嵌套地图检查您的条件,如果满足则更新 weeklyFlag
。
weeklyTimes = weeklyTimes.map((day) => {
day.startEnd = day.startEnd.map(
({ weeklyFlag, weeklyStartTime, weeklyEndTime }) => {
if (weeklyFlag && !weeklyStartTime && !weeklyEndTime) weeklyFlag = false;
return { weeklyFlag, weeklyStartTime, weeklyEndTime };
}
);
return day;
});
映射的时候一定要return新的元素,你可以像我一样把新的值赋给原来的对象,或者新建一个对象。
这是一个嵌套循环,我们 运行 遍历对象,然后 运行 遍历每个对象包含的数组。对于每个,我们查看每个“startEnd”数组并修改它是否符合标准。
function resetWeeklyFlag(wt) {
const shouldBeReset = se => se.weeklyFlag && se.weeklyStartTime === null && se.weeklyEndTime === null;
wt.startEnd.forEach(se => { // inner loop
if (shouldBeReset(se)) se.weeklyFlag = false;
})
}
let weeklyTimes = getWeeklyTimes();
weeklyTimes.forEach(wt => resetWeeklyFlag(wt)); // outer loop
console.log(weeklyTimes)
// return the OP data, just so we can see the answer code up front
function getWeeklyTimes() {
return [{
"day": "Monday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Tuesday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Thursday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Saturday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Sunday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
}
];
}
我认为您的代码物有所值,但由于您要求使用 for 循环方法,所以我会使用:
const weeklyTimes = getWeeklyTimes();
for (day of weeklyTimes) {
for (s of day.startEnd) {
if (s.weeklyFlag && !s.weeklyStartTime && !s.weeklyEndTime) {
s.weeklyFlag = false;
}
}
}
console.log(JSON.stringify(weeklyTimes, null, 2));
function getWeeklyTimes() {
return [{
"day": "Monday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Tuesday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}
]
},
{
"day": "Wednesday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Thursday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
},
{
"weeklyFlag": true,
"weeklyStartTime": "2021-08-08T14:00:00.000Z",
"weeklyEndTime": "2021-08-08T15:00:00.000Z"
}
]
},
{
"day": "Friday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Saturday",
"startEnd": [{
"weeklyFlag": true,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
},
{
"day": "Sunday",
"startEnd": [{
"weeklyFlag": false,
"weeklyStartTime": null,
"weeklyEndTime": null
}]
}
];
}