遍历具有嵌套数组的对象数组并设置特定值

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
      }]
    }
  ];
}