Есть ли способ инициализировать массив в JavaScript ES6?

Я, наконец, сдался и написал цикл for чтобы инициализировать простой массив объектов, где каждый объект имеет увеличенный счетчик (id) как атрибут объекта. Другими словами, я просто хочу:

var sampleData = [{id: 1},{id: 2},...];

Я надеялся на компактный синтаксис, который я мог бы просто добавить в свой оператор return.

let sampleData = [];
for (var p = 0; p < 25; p++){
    sampleData.push({id: p});
}

return {
    data: sampleData,
    isLoading: true
};

Ответы

Ответ 1

Array.from() - хороший способ сделать это. Вы можете передать объект {length: somlength} или некоторый другой объект в виде массива и функцию, которая определяет каждый элемент. Первым аргументом (вызывая его _ только для того, чтобы указать, что он не используется) этой функции будет элемент из массива, который мы передали (но мы передали только длину, поэтому это ничего не значит), второй i - индекс, который используется для вашего id:

let sampleData = Array.from({length: 10}, (_, id) => ({id}))

console.log(sampleData)

Ответ 2

Обычно я делаю так:

const data = Array(10).fill().map((v, i) => ({id: i + 1}))

fill гарантирует, что он может использоваться с map

Ответ 3

Вы можете использовать оператор с spread с Array а затем сопоставить каждый undefined элемент с нужным объектом.

var arr = [...Array(10)].map((_,i)=>({id:i}));
console.log(arr)

Ответ 4

Вы ищете анаморфизм или обратную складку -

// unfold : ((r, state) -> List r, unit -> List r, state) -> List r
const unfold = (f, init) =>
  f ( (x, next) => [ x, ...unfold (f, next) ]
    , () => [] 
    , init
    )
    
// sampleData : List { id: Int }
const sampleData =
  unfold
    ( (next, done, i) =>
        i > 25
          ? done ()
          : next ({ id: i }, i + 1)
    , 0
    )
    
console .log (sampleData)
// [ { id: 0 }, { id : 1 }, ... { id: 25 } ]

Ответ 5

.from() отличный, но если вы действительно хотите получить креатив, проверьте это.

const newArray = length => [...'${Math.pow(10, length) - 1}']
newArray(2)
newArray(10)

Массивно ограничено, хотя

newArray(1000)
["I", "n", "f", "i", "n", "i", "t", "y"]

Ответ 6

Для этого вы можете использовать простой рекурсивный процесс.

const iter = (arr, counter) => {
  if (counter === 25) return arr;
  return iter([...arr, {id:counter}], counter + 1)
}
iter([], 0)