【问题标题】:Iterating through an array of objects with nested arrays and setting a specific value遍历具有嵌套数组的对象数组并设置特定值
【发布时间】:2021-10-14 11:26:36
【问题描述】:

使用下面的对象数组结构,我需要一种方法来扫描此数组中的所有对象元素,即周一到周日并且满足以下条件时,将 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 循环,但不确定是否可以使用数组映射或过滤器?

【问题讨论】:

  • filter 不是你想要的,如果你想返回新数组,你只会使用 map
  • 这在一定程度上取决于您的应用程序的结构。如果您想修改现有数组的 weeklyFlag,那么 for 循环将是最佳选择,因为您修改现有数组而不是创建新数组(例如使用 map)

标签: javascript arrays loops nested-loops


【解决方案1】:

然后使用嵌套地图检查您的条件,如果满足则更新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;
});

映射的时候一定要返回新的元素,你可以像我一样把新的值赋给原来的对象,也可以新建一个对象。

【讨论】:

  • 你刚刚吹走了白天的田野。我也觉得这太复杂了。 For 循环是这里最简单的解决方案。
  • 我想我修好了。而且我认为这并不复杂,只是映射的语法有点疯狂。
  • 不,您只是返回未更改的一天,您从未将内部映射的结果分配给任何东西。此外,如果您使用的是map(),请不要用结果覆盖原始变量。
  • 你是在内部地图中完成的,所有字段都返回了。但是,您正在为代码苦苦挣扎,而且很容易犯这个错误,这说明了为什么它不是最好的解决方案。
  • @seesharper 是否有可能得到一个简单的for loop 示例来满足我的标准?
【解决方案2】:

这是一个嵌套循环,我们遍历对象,然后遍历每个对象包含的数组。对于每一个,我们查看每个“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
      }]
    }
  ];
}

【讨论】:

    【解决方案3】:

    我认为您的代码物有所值,但既然您要求使用 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
          }]
        }
      ];
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 2020-07-25
      • 2022-01-14
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      相关资源
      最近更新 更多