Использование Array.map с новым конструктором Array

Я пытался использоватьnew Array() конструктор сmap для того, чтобы создать однострочный код, который создает список элементов. Что-то вроде этого :

let arr = new Array(12).map( (el, i) => {
  console.log('This is never called');
  return i + 1;
});

чтениедокументыПоведение имеет смысл.

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

Так что это должно работать:

var arr = new Array(12);

for(let i = 0; i < arr.length ; i++){
  arr[i] = undefined;
}

let list = arr.map( (e, i) => {
  console.log(i + 1);
  return i + 1;
});

Итак, мы также можем сделать что-то вроде этого:

let newArray = (length) => {
  let myArray = new Array(length);
  for(let i = 0; i < length; i++) myArray[i] = undefined;
  return myArray;
};

console.log( newArray(12).map( (el, i) => i + 1 ) );

Итак, мой вопрос. Есть ли лучший / красивый способ сделать это с помощью функции карты?

Заранее спасибо!

Ответы на вопрос(5)

Array.apply с объектом с длиной в нем.

var array = Array.apply(null, { length: 12 }).map((_, i) => i + 1);
console.log(array);

Раздел 22.1.3.15 изспецификация получает вас, с последней строкойNOTE 1:

callbackfn вызывается только для тех элементов массива, которые действительно существуют; он не вызывается для отсутствующих элементов массива.

Это поведение разделяетсяfilter, forEachи другие функциональные методы.

Конструктор массива, который вы вызываете,Array(len) отраздел 22.1.1.2, устанавливает длину массива, но не инициализирует элементы. Я не уверен, где спецификация определяет отсутствующий элемент, но массив, созданныйnew Array(len) должно соответствовать этому, и поэтому ни один из элементов не будет затронутmap.

 MinusFour27 мая 2016 г., 18:01
Он не инициализирует массив сundefined ценности. Проще говоря, объект не имеет никаких свойств от 0 до любой длины, которая была указана.
 Tushar27 мая 2016 г., 17:53
Массив, созданныйnew Array(n) содержитотверстия то есть[undefined × n] и, следовательно, не может быть повторенmap, filter, forEach...
 ssube27 мая 2016 г., 18:00
@ Тушар спецификация считает, что в массиве отсутствуют элементы, а не «дыры». Есть тонкие различия между разреженным массивом и массивом с такими неустановленными элементами.
Решение Вопроса

Ты можешь использоватьArray#from создать массив пройденной длины.

Array.from({length: 12}, (e, i) => i + 1);
 Tushar27 мая 2016 г., 18:10
@ Squint Спасибо. Я обновил ответ. :)
 user110692527 мая 2016 г., 18:09
@JoseHermosillaRodrigo: Да, вы просили.map, Я просто указываю на это, чтобы люди не использовали это на практике. Ничего плохого в этом ответе из того, что я вижу, так что +1.
 Jose Hermosilla Rodrigo27 мая 2016 г., 18:03
Я не знаю. Я проголосовал за тебя. Я думаю, это довольно круто, поэтому я отмечу этот ответ, потому что он чище и работает для меня. И был первым. знак равно
 Jose Hermosilla Rodrigo27 мая 2016 г., 17:51
Довольно круто! Я прочитаю Array.from из документов! Спасибо за этот полезный ответ! Ответ будет отмечен через 9 минут! знак равно
 Jose Hermosilla Rodrigo27 мая 2016 г., 18:05
@squint Вы правы, но это моя вина из-за недостатка знаний, потому что я говорю, что хочу использовать карту, поэтому Array.from ({length: 12}, (el, i) => i +1); должен работать как задумано в вопросе.
 Jose Hermosilla Rodrigo27 мая 2016 г., 18:12
@ Squint и Tushar. Я ценю вашу помощь! знак равно
 user110692527 мая 2016 г., 18:02
Я не избиратель, но я бы отметил, чтоArray.from принимает обратный вызов, который ведет себя как.map(), Если вы используете это, то вы не создаете ненужный промежуточный массив.

новый массив конструктор.

Вот как это сделать. Одна строчка, красивая ES6:

let me = [...new Array(5)].map((x,i)=>i)
// [0,1,2,3,4]

Объяснение:

new Array(5) генерирует это:[ , , , , ]​​​​​[...new Array(5)] это сокращение дляArray.from(new Array(5))и генерирует это:​​​​​[ undefined, undefined, undefined, undefined, undefined ]​​​​​это массивundefined объекты. Да,undefined это значение (примитивное :)).Теперь мы можем перебрать значения нашего нового массива: D

PS: вы даже можете пропуститьnew Ключевое слово и сделать:

[...Array(5)].map((x,i)=>i)

let arr = Array.apply(null, Array(12))
    .map(function (x, i) {
        return i
    });

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

посколькуNew Array возвращает массив, содержащий «дыры», мы используем apply, потому что apply обрабатывает дыры, как будто они не определены. Это распространяется неопределенно по всему массиву, что делает его сопоставимым.

 Jose Hermosilla Rodrigo27 мая 2016 г., 17:58
Извините за отсутствие знаний, но не могли бы вы объяснить, почему это работает? Что делает Array.apply ()?
 KevBot27 мая 2016 г., 18:04
@JoseHermosillaRodrigo, я добавил пояснения к своему ответу. Кроме того, вот некоторая документация поapply

Ваш ответ на вопрос