Как сгенерировать последовательность чисел / символов в JavaScript?

Есть ли способ генерировать последовательность символов или чисел в JavaScript?

Например, я хочу создать массив, который содержит восемь единиц. Я могу сделать это с помощью цикла for, но интересно, есть ли библиотека jQuery или функция javascript, которая может сделать это для меня?

 Russell Dias20 сент. 2010 г., 14:39
Что не так с использованиемfor цикл?
 user37255120 сент. 2010 г., 14:41
Есть ли необходимость в библиотеке для этой работы? Я так не думаю =)
 Rob23 мая 2013 г., 13:30
Я думаю, что это очень актуальный вопрос, есть языки, которые делают это «из коробки», если вам нужно создать 3 выпадающих списка в день / месяц / год, тогда 3 для циклов кажется грязным, однако также кажется, что это единственный быстрый способ сделать это
 Dagg Nabbit20 сент. 2010 г., 14:43
Не за что. Очевидно, это лучше всего решать на уровне языка, а не на уровне библиотеки. Я изменил вопрос соответственно.

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

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

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

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

function make_sequence (value, increment)
{
  if (!value) value = 0;
  if (!increment) increment = function (value) { return value + 1; };

  return function () {
    let current = value;
    value = increment (value);
    return current;
  };
}

i = make_sequence()
i() => 0
i() => 1
i() => 2

j = make_sequence(1, function(x) { return x * 2; })
j() => 1
j() => 2
j() => 4
j() => 8
 stib11 окт. 2016 г., 14:31
upvoting, потому что я пытаюсь разобраться в замыканиях и думаю, что это действительно хороший пример, хорошо?
 ceving11 окт. 2016 г., 15:32
@stib Точно. Анонимная функция, возвращаемаяmake_sequence захватывает среду, содержащуюvalue а такжеincrement, что означает, что функция имеет доступ к переменным для чтения и записи. Это все, что имеет значение. (Лексическое) замыкание - это не что иное, как динамически генерируемая функция, имеющая доступ к среде, видимой в позиции кода, где функция была создана. Это такжединамически ограниченный замыкания, но кроме Emacs они используются редко.

то же самое может быть достигнуто с помощью:

Array(8).fill(1)

Следующее тоже хорошо работает, но, как заметил Мэтт, ключевое слово «new» является избыточным.

new Array(8).fill(1)
 Matt15 апр. 2017 г., 03:04
Это можно легко распространить на последовательность.Array(8).fill().map((v,i)=>i)
 Matt15 апр. 2017 г., 06:05
и не требуетnew
 Quentin 223 февр. 2018 г., 13:06
Или для последовательности: [... Array (8)]. Map ((_, i) => i)
The fastest way to define an array of 8 1s is to define it-
var A= [1, 1, 1, 1, 1, 1, 1, 1];

// You'd have to need a lot of 1s to make a dedicated function worthwhile.

// Maybe in the Matrix, when you want a lot of Smiths:

Array.repeat= function(val, len){
    for(var i= len, a= []; i--; ) a[i]= val;
    return a;
}
var A= Array.repeat('Smith',100)

/*  returned value: (String)
Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith, Smith
*/
 stib11 окт. 2016 г., 14:29
это должно бытьfor(var i= len; a= []; i--; ) a[i]= val; (точка с запятой вместо len вместо запятой)?
Решение Вопроса

я полагаю, для вашего примера:

function makeArray(count, content) {
   var result = [];
   if(typeof content == "function") {
      for(var i = 0; i < count; i++) {
         result.push(content(i));
      }
   } else {
      for(var i = 0; i < count; i++) {
         result.push(content);
      }
   }
   return result;
}

Тогда вы можете сделать одно из следующих:

var myArray = makeArray(8, 1);
//or something more complex, for example:
var myArray = makeArray(8, function(i) { return i * 3; });

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

 user33819520 сент. 2010 г., 15:02
Эй, спасибо за это. Мысль может быть чем-то похожим на то, что доступно в MatLab, то есть создать вектор некоторой длины, который будет содержать определенные элементы.
 Gabriele Petrioli20 сент. 2010 г., 14:43
Я думаюresult.push(i); должно быть `result.push (content);` ааа ... уже отредактировано ..
 Nick Craver20 сент. 2010 г., 14:44
@Gaby - Да, заметил, что когда я настраиваю демо, спасибо :)

2016 - Пришла функциональность современного браузера..

Array.from({length: 8}, (el, index) => 1);

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

Примечание: IE не поддерживается в этом решении, но для этого есть polyfilldeveloper.mozilla.org / ...

Метод машинописи на основе кода Ария Хидаят:

/**
 * Generates sequence of numbers from zero.
 * @ param {number} count Count of numbers in result array.
 * @ return {Array<number>} Sequence of numbers from zero to (count - 1).
 */
public static sequence(count: number): Array<number>
{
    return Array.apply(0, Array(count)).map((x, i) =>
    {
        return i;
    });
}

как и я, вы часто используете linspace, вы можете легко изменить свою версию linspace следующим образом:

function linSeq(x0, xN) {
    return linspace(x0, xN, Math.abs(xN-x0)+1);
}

function linspace(x0, xN, n){

    dx = (xN - x0)/(n-1);
    var x = [];
    for(var i =0; i < n; ++i){
        x.push(x0 + i*dx);
    }

    return x;
}

Затем вы можете использовать linSeq в любом направлении, например, linSeq (2,4) генерирует 2,3,4, в то время как linSeq (4,2) генерирует 4,3,2.

Array.apply(0, Array(8)).map(function() { return 1; })

Объяснение следующее.

Array(8) создает разреженный массив из 8 элементов, всеundefined,apply трюк превратит его в плотный массив. Наконец, сmapмы заменим этоundefined (то же самое) значение1.

 Alexandr Kurilin07 февр. 2013 г., 07:47
Это действительно круто, хотя я не совсем понимаю. Как именно Array.apply превращает этот массив в плотный массив? Я бы хотел точно понять, что происходит в этом трюке.
 stoolio10 апр. 2015 г., 03:54
Мне это нравится. Нашел его в поиске, и это было именно то, что я искал. Вот небольшая модификация для создания серии:Array.apply(0, Array(8)).map(function(_,b) { return b + 1; }) => [1, 2, 3, 4, 5, 6, 7, 8]  Арги на карту являютсяelement, index, array для других забавных целей.
 Ariya Hidayat10 февр. 2013 г., 05:39
Вот хорошее краткое объяснение массивов:2ality.com/2012/06/dense-arrays.html.

Используя Jquery:

$.map($(Array(8)),function(val, i) { return i; })

Это возвращает:

[0, 1, 2, 3, 4, 5, 6, 7]
$.map($(Array(8)),function() { return 1; })

Это возвращает:

[1, 1, 1, 1, 1, 1, 1, 1]
 Antony Hatchkins30 янв. 2015 г., 07:57
$ в$(Array(8)) здесь не нужно Просто$.map(Array(8), function(){ return 1; }) было бы достаточно.
range(start,end,step): С итераторами ES6

Вы можете легко создатьrange() функция генератора, которая может функционировать как итератор. Это означает, что вам не нужно предварительно генерировать весь массив.

function * range ( start, end, step ) {
  let state = start;
  while ( state < end ) {
    yield state;
    state += step;
  }
  return;
};

Теперь вы можете создать что-то, что предварительно сгенерирует массив из итератора и вернет список. Это полезно для функций, которые принимают массив. Для этого мы можем использоватьArray.from()

const generate_array = (start,end,step) => Array.from( range(start,end,step) );

Теперь вы можете легко создать статический массив,

const array = generate_array(1,10,2);

Но когда что-то требует итератор (или дает вам возможность использовать итератор), вы также можете легко его создать.

for ( const i of range(1, Number.MAX_SAFE_INTEGER, 7) ) {
  console.log(i)
}

Почему бы не просто объединить и разделить?

function seq(len, value)
{
    // create an array
    // join it using the value we want
    // split it
    return (new Array(len + 1)).join(value).split("");
}

seq(10, "a");
["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"]

seq(5, 1);
["1", "1", "1", "1", "1"]
for (var i=8, a=[]; i--;) a.push(1);
 user37255120 сент. 2010 г., 14:43
не хватает jQuery =)
 Dagg Nabbit20 сент. 2010 г., 21:08
@ Авинаш, я знаю, просто крутился;)
 user37255120 сент. 2010 г., 14:52
@ Не шучу, OP может не быть удовлетворен, потому что отсутствует jQuery, смеется. В вашем комментарииa.push($(1))он помещает объекты jQuery в массив, а не числа :)
 Dagg Nabbit20 сент. 2010 г., 14:44
нужен рыжий jquery? хммм, это работает:for (var i=8, a=[]; i--;) a.push($(1));

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