Перебор массива объектов с вложенными массивами и установка определенного значения

#javascript #arrays #loops #nested-loops

Вопрос:

Используя приведенную ниже структуру массива объектов, мне нужно средство сканирования всех элементов объекта в этом массиве, т. Е. с понедельника по воскресенье, и если выполняются следующие критерии, сбросьте weeklyFlag значение false, т. Е.:

 weeklyFlag is true 
weeklyStartTime is null
weeklyEndTime is null
 

затем сбросьте weeklyFlag to false

Поэтому, используя приведенные выше критерии для приведенного ниже примера, в любом месте, где выполняются вышеуказанные критерии, мне нужно сбросить значение false для этого конкретного объекта массива weeklyFlag .

Таким образом, это будет означать для индекса понедельника, вторника 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
                            }
                        ]
                    }
];
 

Я искал вложенные циклы, но не уверен, можно ли использовать карту массива или фильтр?

Комментарии:

1. фильтр не был бы тем, что вам нужно, и вы использовали бы карту только в том случае, если бы хотели вернуть новые массивы

2. Это немного зависит от структуры вашего приложения. Если вы хотите изменить существующий массив weeklyFlag , то цикл for будет лучшим выбором, так как вы изменяете существующий массив вместо создания нового (например, с помощью карты).

Ответ №1:

Используйте вложенную карту, чтобы затем проверить свое состояние и, если оно выполнено, обновить weeklyFlag .

 weeklyTimes = weeklyTimes.map((day) => {
  day.startEnd = day.startEnd.map(
    ({ weeklyFlag, weeklyStartTime, weeklyEndTime }) => {
      if (weeklyFlag amp;amp; !weeklyStartTime amp;amp; !weeklyEndTime) weeklyFlag = false;
      return { weeklyFlag, weeklyStartTime, weeklyEndTime };
    }
  );
  return day;
});
 

Обязательно верните новый элемент при сопоставлении, и вы можете присвоить новое значение исходному объекту, как это сделал я, или создать новый объект.

Комментарии:

1. Ты только что уничтожил дневное поле. Я также думаю, что это слишком сложно. Для цикла здесь самое простое решение.

2. Кажется, я все исправил. И я не думаю, что это было сложно, просто синтаксис для отображения может быть немного сумасшедшим.

3. нет, вы просто возвращаете неизмененный день, вы никогда ничему не присваиваете результат внутренней карты. Также, если вы используете map() , не перезаписывайте исходную переменную с результатом.

4. Вы сделали это прямо внутри внутренней карты, где возвращаются все поля. Но тот факт, что вы боретесь с кодом и что так легко совершить эту ошибку, показывает, почему это не лучшее решение.

5. @seesharper можно ли было бы получить простой for loop пример, который охватывал бы мои критерии?

Ответ №2:

Это вложенный цикл, в котором мы проходим через объекты, а затем проходим через массив, содержащийся в каждом из них. Для каждого из них мы рассматриваем каждый массив «startEnd» и изменяем его, если он соответствует критерию.

 function resetWeeklyFlag(wt) {
  const shouldBeReset = se => se.weeklyFlag amp;amp; se.weeklyStartTime === null amp;amp; 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:

Я думаю, что ваш код хорош для того, чего он стоит, но так как вы просили о циклическом подходе, я бы использовал:

 const weeklyTimes = getWeeklyTimes();
for (day of weeklyTimes) {
  for (s of day.startEnd) {
    if (s.weeklyFlag amp;amp; !s.weeklyStartTime amp;amp; !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
      }]
    }
  ];
}