Индекс внутри функции map ()

291

Мне не хватает опции, как получить номер индекса внутри mapфункции, используя Listиз Immutable.js:

var list2 = list1.map(mapper => { a: mapper.a, b: mapper.index??? }).toList();

Документация показывает, что map()возвращается Iterable<number, M>. Есть ли какой-нибудь элегантный способ, что мне нужно?

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

Ответы:

532

Вы сможете получить текущую итерацию indexдля mapметода через его второй параметр.

Пример:

const list = [ 'h', 'e', 'l', 'l', 'o'];
list.map((currElement, index) => {
  console.log("The current iteration is: " + index);
  console.log("The current element is: " + currElement);
  console.log("\n");
  return currElement; //equivalent to list[index]
});

Вывод:

The current iteration is: 0 <br>The current element is: h

The current iteration is: 1 <br>The current element is: e

The current iteration is: 2 <br>The current element is: l

The current iteration is: 3 <br>The current element is: l 

The current iteration is: 4 <br>The current element is: o

Смотрите также: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map

параметры

callback - функция, которая создает элемент нового массива, принимая три аргумента:

1) currentValue
Текущий элемент, обрабатываемый в массиве.

2) index
Индекс текущего элемента, обрабатываемого в массиве.

3) массив
Карта массива была вызвана.

Самуэль Тох
источник
Должна ли функция обратного вызова карты всегда иметь оператор возврата? Что означает «Х» в вашем коде?
Harsha_K
1
@HarshKanchina mapОперация используется для создания нового массива путем перебора элементов данного массива. Чтобы ответить на ваш вопрос, да, требуется оператор возврата, и для этого случая он возвращает значение «X» на каждой итерации. Таким образом, конечный продукт кода будет[ 'X', 'X','X','X' ]
Самуил Тох
@ Но 'X' нигде не определено. Так к чему это относится? Как функция узнает, на что здесь ссылается X?
Harsha_K
3
@HarshKanchina 'X'- это строка.
Самуил Тох
Я хочу, чтобы этот индекс начинался с 1, как я могу добиться этого?
Reema Parakh
27

Array.prototype.map() индекс:

Доступ к индексу можно получить Array.prototype.map()через второй аргумент функции обратного вызова. Вот пример:

const array = [1, 2, 3, 4];


const map = array.map((x, index) => {
  console.log(index);
  return x + index;
});

console.log(map);

Другие аргументы Array.prototype.map():

  • Третий аргумент функции обратного вызова представляет массив, на котором была вызвана карта
  • Второй аргумент Array.map()- это объект, который будет thisзначением для функции обратного вызова. Имейте в виду, что вы должны использовать обычное functionключевое слово для объявления обратного вызова, так как функция стрелки не имеет собственной привязки к thisключевому слову.

Например:

const array = [1, 2, 3, 4];

const thisObj = {prop1: 1}


const map = array.map( function (x, index, array) {
  console.log(array);
  console.log(this)
}, thisObj);

Виллем ван дер Веен
источник
2

Используя Рамду:

import {addIndex, map} from 'ramda';

const list = [ 'h', 'e', 'l', 'l', 'o'];
const mapIndexed = addIndex(map);
mapIndexed((currElement, index) => {
  console.log("The current iteration is: " + index);
  console.log("The current element is: " + currElement);
  console.log("\n");
  return 'X';
}, list);
Дэвид
источник