Есть ли преимущества у _.filter перед _.forEach, когда проверяется одно значение, а затем записывается другое? - PullRequest
0 голосов
/ 01 августа 2020

Я новичок в JavaScript, поэтому я довольно сильно полагаюсь на eslint и плагины, чтобы помочь мне. Я пишу для среды, в которой есть loda sh 3.9.3 и которая должна работать с Chrome 40, что означает es5.

У меня есть небольшой код:

            _.forEach(star.system().planets, function (world) {
              if (world.starting_planet === true)
                if (world.planet) {
                  world.planet.shuffleLandingZones = true;
                } else world.generator.shuffleLandingZones = true;
            });

eslint-plugin-lodash выдает сообщение «Предпочитайте _.filter или _.some оператору if внутри _.forEach», ссылаясь на его статью Prefer-filter .

На мой взгляд, _.forEach кажется здесь правильным выбором, поскольку я хочу установить новое значение в существующем массиве. Но я попробовал это и придумал

            var startingPlanets = _.filter(star.system().planets, {
              starting_planet: true,
            });
            _.forEach(startingPlanets, function (planets) {
              if (planets.planet) {
                planets.planet.shuffleLandingZones = true;
              } else planets.generator.shuffleLandingZones = true;
            });

Но я смотрю на это и думаю, разве это не менее эффективно, поскольку теперь я повторяю два массива вместо одного? Я что-то упускаю? Должен ли я игнорировать линтер на этом? Я неправильно использовал _.filter для достижения своей цели?

1 Ответ

2 голосов
/ 01 августа 2020

Вы можете проигнорировать это предупреждение линтера здесь - filter следует использовать только тогда, когда целью является создание другого массива, ваш код в основном в порядке.

не только меньше эффективен, поскольку теперь я повторяю два массива вместо одного?

Не обязательно, поскольку loda sh реализует конвейерную обработку , чтобы избежать создания временного массива. Я бы рекомендовал писать это как

_(star.system().planets).filter({
    starting_planet: true,
}).forEach(function (world) {
    var planet = world.planet || world.generator;
    planet.shuffleLandingZones = true;
});
...