Могу ли я использовать операторы повтора в данных?

#javascript

Вопрос:

Возможно ли это?

Я хочу создавать непрерывные объектные данные.

  • чего я хочу
       return [
          { text: '2', align: 'center', value: '2', sort: false },
          { text: '3', align: 'center', value: '3', sort: false },
          { text: '4', align: 'center', value: '4', sort: false },
          { text: '5', align: 'center', value: '5', sort: false },
          { text: '6', align: 'center', value: '6', sort: false },
          { text: '7', align: 'center', value: '7', sort: false },
          { text: '8', align: 'center', value: '8', sort: false },
      ]
     
  • мое мнение
       return [
          () => {
              for (let i = 0; i >= 8; i  ) {
                  return {
                      text: i,
                      align: 'center',
                      value: i >= 10 ? `day${i}` : `day0${i}`,
                      sort: false,
                  }
              }
          },
      ]
     

Но это, конечно, не сработало. Как я могу сделать это таким образом?

Комментарии:

1. Создайте массив в цикле, а затем верните его

2. Ваш цикл for также проблематичен: вы имеете в виду i <= 35 ? Это не вопрос, специфичный для Vue, а скорее общий вопрос JS.

Ответ №1:

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

 const result = new Array(35).fill(0).map((_, i) => ({
  text: i,
  align: 'center',
  value: i >= 10 ? `day${i}` : `day0${i}`,
  sort: false,
}));

console.log(result); 

Ответ №2:

Вы можете объявить небольшую вспомогательную функцию, которая вызывает функцию для (отображения) заданного диапазона целых чисел, например:

 function mapRange(min, max, fn) {
  const out = [];
  for (let i = min; i < max; i  ) {
    out.push(fn(i));
  }
  return out;
}
 

Тогда вы можете просто

 const result = mapRange(0, 35,  (i) => ({
  text: i,
  align: 'center',
  value: i >= 10 ? `day${i}` : `day0${i}`,
  sort: false,
}));
 

(Согласно тесту JSBench, это примерно на 20% быстрее, чем аналогичное решение Jamiec, использующее new Array().fill().map() идиому.)

Комментарии:

1. …и без дополнительного вызова функции (т. Е. простого цикла, заполняющего массив) это было бы еще быстрее. К чему ты клонишь? в любом массиве, меньшем, чем по крайней мере несколько сотен тысяч записей, мы говорим о разнице в наносекундах

2. Что, если вам нужна идиома, похожая на карту, это немного быстрее 🙂

Ответ №3:

Другие ответы слишком длинные… бесполезно… Попробуй

 [...Array(7)].map((_, i) => ({ text: `${i 2}`, align: 'center', value: `${i 2}`, sort: false }));
 

Комментарии:

1. самый короткий код не всегда является самым простым для чтения кодом