Я хочу использовать эту map()
функцию для массива javascript, но хочу, чтобы она работала в обратном порядке.
Причина в том, что я рендеринг составных компонентов React в проекте Meteor и хотел бы, чтобы элемент верхнего уровня отображался первым, а остальные загружали изображения ниже.
var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.map(function (el, index, coll) {
console.log(el + " ")
});
распечатывает, a b c d e
но мне жаль, что не было mapReverse (), который напечаталe d c b a
Какие-либо предложения?
javascript
arrays
Робин Ньюхаус
источник
источник
reverse
массив?map
возвращаемый массив ? В противном случае вам следует подуматьforEach
.console.log(coll[coll.length - index - 1] + " ")
Ответы:
Если вы не хотите переворачивать исходный массив, вы можете сделать его неглубокую копию, а затем отобразить обратный массив,
myArray.slice(0).reverse().map(function(...
источник
slice(0)
Не нужен , посколькуreverse()
возвращает новый массив и не изменяет текущий массив. @ AdamCooper86, надеюсь, ты это изменишь.reverse()
ДЕЙСТВИТЕЛЬНО изменяет исходный массив.Не изменяя массив вообще, вот однострочное решение O (n), которое я придумал:
myArray.map((val, index, array) => array[array.length - 1 - index]);
источник
val
здесь не используется, поэтому я не думаю, что это то, что искал OP? (это все еще хорошее решение)Ты можешь использовать
Array.prototype.reduceRight()
var myArray = ["a", "b", "c", "d", "e"]; var res = myArray.reduceRight(function (arr, last, index, coll) { console.log(last, index); return (arr = arr.concat(last)) }, []); console.log(res, myArray)
источник
С именованной функцией обратного вызова
const items = [1, 2, 3]; const reversedItems = items.map(function iterateItems(item) { return item; // or any logic you want to perform }).reverse();
Сокращение (без именованной функции обратного вызова) - синтаксис стрелки, ES6
const items = [1, 2, 3]; const reversedItems = items.map(item => item).reverse();
Вот результат
источник
Другим решением может быть:
const reverseArray = (arr) => arr.map((_, idx, arr) => arr[arr.length - 1 - idx ]);
Вы в основном работаете с индексами массива
источник
Я предпочитаю написать функцию mapReverse один раз, а затем использовать ее. Также не нужно копировать массив.
function mapReverse(array, fn) { return array.reduceRight(function (result, el) { result.push(fn(el)); return result; }, []); } console.log(mapReverse([1, 2, 3], function (i) { return i; })) // [ 3, 2, 1 ] console.log(mapReverse([1, 2, 3], function (i) { return i * 2; })) // [ 6, 4, 2 ]
источник
function mapRevers(reverse) { let reversed = reverse.map( (num,index,reverse) => reverse[(reverse.length-1)-index] ); return reversed; } console.log(mapRevers(myArray));
I Вы передаете массив в карту Revers, а в функции возвращаете обратный массив. На карте cb вы просто берете значения с индексом от 10 (длина) до 1 из переданного массива
источник
Вот мое решение TypeScript, которое одновременно O (n) и более эффективно, чем другие решения, за счет предотвращения двойного прохода через массив:
function reverseMap<T, O>(arg: T[], fn: (a: T) => O) { return arg.map((_, i, arr) => fn(arr[arr.length - i - 1])) }
В JavaScript:
const reverseMap = (arg, fn) => arg.map((_, i, arr) => fn(arr[arr.length - 1 - i])) // Or function reverseMap(arg, fn) { return arg.map((_, i, arr) => fn(arr[arr.length - i - 1])) }
источник
Сначала вы можете выполнить myArray.reverse ().
var myArray = ['a', 'b', 'c', 'd', 'e']; myArray.reverse().map(function (el, index, coll) { console.log(el + " ") });
источник
Старый вопрос, но для новых зрителей это лучший способ перевернуть массив с помощью карты
var myArray = ['a', 'b', 'c', 'd', 'e']; [...myArray].map(() => myArray.pop());
источник
[...myArray].map((_, _, arr) => arr.pop());
:?