Какой способ перебора массива и изменения элемента по карте более эффективен? - PullRequest
1 голос
/ 30 мая 2020

У меня вопрос по карте. Как вы знаете, с помощью карты мы можем перебирать массивы и изменять элементы массивов. Для этого есть два способа, и я перечислил их ниже. Какой способ имеет меньшую сложность и большую производительность. ? (В примерах массивы не большие, но представьте себе реальный мир, как 500 элементов в массиве)

var numbers = [4, 9, 16, 25];
numbers=numbers.map(e=>{
 return e=e*2;
})

В этом подходе каждое возвращаемое значение присваивается текущему массиву.

numbers.map((e,a)=>{
  numbers[a]=e*2;
})

В этом на каждой итерации нам нужно go массивировать по индексу, чтобы найти элемент, и я думаю, что это хуже, чем указано выше, но я не уверен.

Ответы [ 4 ]

6 голосов
/ 30 мая 2020

Не используйте map, если вы не собираетесь использовать массив, который он создает. Если вы просто хотите использовать l oop через массив, используйте al oop или forEach или аналогичный.

Хотите ли вы новый массив или нет, наиболее эффективный способ к l oop через массив обычно имеет for l oop:

const numbers = [4, 9, 16, 25];
for (let i = 0, len = numbers.length; i < len; ++i) {
    numbers[i] = numbers[i] * 2;
}

(или любой из нескольких вариантов этого.)

Но «большинство эффективный »крайне маловероятен в реальном коде , поэтому использование таких вещей, как map (если вам нужен новый массив) или forEach (если вы этого не сделаете), вполне нормально. map - это идиоматия c для этой операции (создание нового массива, содержащего записи из предыдущего измененного каким-либо образом).

Заключение:

Если вам нужен новый массив, не стесняйтесь использовать map или создать пустой массив и использовать любую из ваших опций для зацикливания массивов от до l oop оригинала и добавления записей в новый.

Если вам не нужен новый массив, не используйте map, используйте любой из ваших вариантов итерации по оригиналу, кроме тех, которые не дают вам индекса, и назначьте обновленный значение обратно к записи.

2 голосов
/ 30 мая 2020

Семантически вам понадобится for или forEach, когда вам не нужен новый массив. Для достаточно маленьких массивов разницы в производительности нет

var numbers = [4, 9, 16, 25];
numbers.forEach((e,i)=> numbers[i] = e*2);
console.log(numbers)
1 голос
/ 30 мая 2020
nums.forEach((v, i) => nums[i] = v);

- это самый быстрый из возможных методов, который вы указали (эквивалент вашего второго метода. Почему? nums = nums.map(...) создает полную копию массива в памяти и заменяет массив этой копией. Когда вы просто перебираете массив с индексом и заменяете элементы, вы избегаете создания этой копии, и в итоге она оказывается примерно на 15% быстрее (см. этот тест .

0 голосов
/ 30 мая 2020

Самый быстрый способ изменить значение массива - выполнить итерацию по индексу и обновить элемент.

Этот подход более предпочтителен, чем forEach или map, потому что он не требует дополнительных затрат this и ему не нужна особенность предоставленной структуры обратного вызова.

var numbers = [4, 9, 16, 25];

for (let i = 0; i < numbers.length; i++) numbers[i] *= 2;

console.log(numbers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...