Как я могу заставить функцию карты возвращать массив, который больше первого? - PullRequest
0 голосов
/ 24 апреля 2020

из Array.prototype.map doucmentation , он упоминает, что должна быть возможность изменить массив, из которого была вызвана карта, из обратного вызова карты, который принимает три параметра, # 1 значение, # 2 индекс, # 3 исходный массив, в дополнение к следующему:

thisArgOptional Значение, используемое в качестве этого при выполнении обратного вызова. ... Подробные параметры

обратный вызов вызывается с тремя аргументами: значением элемента, индексом элемента и отображаемым объектом массива.

Если указан параметр thisArg , он будет использоваться как это значение обратного вызова. В противном случае значение undefined будет использоваться как его значение this. Это значение, в конечном итоге наблюдаемое при обратном вызове, определяется в соответствии с обычными правилами определения этого, видимого функцией.

map не изменяет массив, в котором оно вызывается (хотя обратный вызов, если он вызывается, может сделать это ).

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

Таким образом, можно сказать, что хотя значения, «добавленные в исходный массив», не будут просматриваться картой , но это подразумевает, что действительно возможно добавить к исходному массиву изнутри карты. Однако я не уверен, как это сделать, поскольку простое использование третьего параметра массива и добавление к нему, похоже, ничего не делает (и если я сохраняю его в массиве, я не могу просто использовать исходное имя переменной массива, потому что карта возвращает новый массив):

var myArr = [
  1, 2, 3, 4, 5
].map(function(x, i, arr) {
    this.push(i); //references old array so does nothing
    arr.push(i); //seemingly it should adjust
    return x;
}, myArr /*
  attempting to use "this"
  arg to see if it will work,
  although seemingly its not recognized
*/
);

console.log(myArr); //only returns original value

1 Ответ

2 голосов
/ 24 апреля 2020

Обновление

Чтобы ответить на ваш комментарий, .map() не подходит для добавления значений в ваш массив. Вы должны использовать его, когда вам нужно изменить каждый элемент входного массива, например, удвоив каждое значение:

var input = [1,2,3,4,5];
var myArr = input.map(function (x) {
  return x * 2;
});

myArr.push(6,7); // Append your values in a separate statement.

console.log(myArr); // [2,4,6,8,10,6,7]

Затем вы добавляете новые значения на отдельном шаге до или после карты, в зависимости от что вы хотите достичь.

Объяснение

Ваш код ведет себя не так, как вы ожидаете. console.log(myArr) похоже, что он печатает исходный массив, но на самом деле это не так. Например, если вы удалите весь другой код, у вас останется это:

var myArr = [1,2,3,4,5].map(function (x) {
  return x;
});

console.log(myArr); // [1,2,3,4,5]

Вы можете видеть, что мы просто возвращаем x без внесения каких-либо изменений. x разрешится до 1, затем 2 и т.д. c по очереди. Выходные данные .map() будут поэтому [1,2,3,4,5], который содержит идентичные значения для вашего входного массива, но не является точно таким же массивом, это копия.

Вы можете доказать это, переместив ваш входной массив в новый переменная и затем сравнение myArr === input в конце:

var input = [1,2,3,4,5];
var myArr = input.map(function (x) {
  return x;
});

console.log(input); // [1,2,3,4,5]
console.log(myArr); // [1,2,3,4,5]
console.log(myArr === input); // false

Чтобы сделать этот шаг еще дальше, если мы возьмем 3-й параметр .map() и заменим каждый элемент на двойное его значение, мы увидим что исходный input массив действительно изменяется, а возвращаемое значение из .map(), myArr остается прежним.

var input = [1,2,3,4,5];
var myArr = input.map(function (x, i, arr) {
  arr[i] = x * 2;
  return x;
});

console.log(input); // [2,4,6,8,10]
console.log(myArr); // [1,2,3,4,5]
console.log(myArr === input); // false

Бонусные баллы

То, что вы можете изменить исходный массив с помощью 3-го параметра .map(), не означает, что вы должны это сделать. Это может привести к непредвиденному поведению и затруднить будущим разработчикам рассуждать о том, что делает код.

Гораздо лучше, чтобы ваши функции возвращали новую переменную, а не изменяли входные параметры.

...