Например, как достичь следующего без итерации по массиву?
var a = [1, 2, 3] * 5; // a should equal [5, 10, 15]
Например, как достичь следующего без итерации по массиву?
var a = [1, 2, 3] * 5; // a should equal [5, 10, 15]
Array.map()
доступен для пользователей IE, как и для IE9, поэтому, если вы вообще не заботитесь о совместимости, вы можете использовать это:
var a = [1, 2, 3].map(function(x) { return x * 5; });
Для JavaScript 1.8 это как можно короче:
var a = [1, 2, 3].map(function(x) x * 5);
Если вам нужна максимальная совместимость с браузером, вам придется мириться с циклом.
В любом случае вы будете выполнять итерацию по массиву; Array.map()
просто делает это менее очевидным, что вы это делаете.
В ECMAScript 6 вы можете использовать функции стрелок:
var a = [1, 2, 3];
var b = a.map(x => x * 5); // <-------
console.log(b); // [5, 10, 15]
Функции стрелок являются синтаксическим сахаром для встроенной функции с лексическим связыванием this
:
// ES6
let array2 = array1.map(x => x * 5);
// ES5
var array2 = array1.map((function (x) { return x * 5; }).bind(this));
Поэтому, если вам нужна поддержка Internet Explorer или других старых браузеров (Edge понимает ES6), вы можете использовать babeljs или TypeScript в своем проекте для пересечения -компилируйте ваш код в синтаксис ES5.
for(var i=0; i<a.length; i++) {
a[i] *= 5;
}
Экземпляр 2016 (ES7) определяет SIMD-математику, которая позволяет делать умножения, подобные тому, который вы хотите быстрее и проще. Тем не менее, на сегодняшний день SIMD поддерживает очень мало браузера (только поддержка Firefox в ночное время поддерживает это) [1], [2]. Вот как это будет выглядеть:
var a = SIMD.Float32x4(1, 2, 3);
var b = SIMD.Float32x4(5, 5, 5);
SIMD.Float32x4.mul(a, b); // Float32x4[5, 10, 15]
Пока не будет широко распространенной поддержки SIMD, вам придется прибегать к использованию карты
var a = [1, 2, 3].map(function(x) { return x * 5; });
который хорошо поддерживается всеми современными браузерами [3].
Вы можете использовать .map, но вам также нужно создать новую переменную, чтобы вывести новые значения в:
var a = [1,2,3];
var b = a.map(function(x){
return x * 5;
});
alert(b);
var a, i, ii, term;
a = [1,2,3];
term = 5;
for (i=0, ii=a.length; i<ii; i++) {
a[i] = a[i] * term;
}
Вы можете попробовать следующее:
function scalarMultiply(arr, multiplier) {
for (var i = 0; i < arr.length; i++)
{
arr[i] *= multiplier;
}
return arr;
}
ИСПОЛЬЗОВАНИЕ
var a = scalarMultiply([1, 2, 3], 5);
Как указано в Docs:
Метод
map()
создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.
По-моему, .map()
более подходит, если кто-то хочет создать новый массив на основе входных значений из текущего массива.
Однако, если кто-то хочет изменить массив на месте, .forEach()
кажется лучшим выбором.
В ES6 мы можем использовать:
Следующий код изменит данный массив arr
на месте (без создания нового):
arr.forEach((value, index) => {arr[index] *= 5});
Demo:
var arr = [1, 2, 3];
var scalar = 5;
arr.forEach((value, index) => {
arr[index] *= scalar;
});
console.log(arr);
Используя функцию отображения Lodash, это возвращает исходный массив a, умноженный на константу 5:
_.map( a, function multiply(x){ return x*5; } );