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

  • Не ловить NullPointerException. Это плохая практика. Лучше убедиться, что значение не равно нулю.
  • Метод № 4 будет работать для вас. Он не будет оценивать второе условие, потому что Java имеет короткое замыкание (то есть последующие условия не будут оцениваться, если они не изменяют конечный результат логического выражения). В этом случае, если первое выражение логического И оценивается как ложное, последующие выражения не нужно оценивать.
32
задан Shadow The Princess Wizard 13 March 2018 в 15:47
поделиться

10 ответов

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

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, поэтому вы можете использовать его без. Вы просто ничего не получаете из библиотеки за что-то вроде этого:)

15
ответ дан 27 November 2019 в 19:52
поделиться

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

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

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

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
3
ответ дан 27 November 2019 в 19:52
поделиться

Если вы используете более новый синтаксис Javascript, то же самое может быть достигнуто с помощью:

Array(8).fill(1)

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

new Array(8).fill(1)
11
ответ дан 27 November 2019 в 19:52
поделиться
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
*/
1
ответ дан 27 November 2019 в 19:52
поделиться

Один лайнер:

new Array(10).fill(1).map( (_, i) => i+1 )

Выходы:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
6
ответ дан 27 November 2019 в 19:52
поделиться

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)
}
1
ответ дан 27 November 2019 в 19:52
поделиться

2016 год - появилась функциональность современного браузера. Нет необходимости в jquery все время.

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

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

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

7
ответ дан 27 November 2019 в 19:52
поделиться

Если вы, как и я, часто используете 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.

0
ответ дан 27 November 2019 в 19:52
поделиться

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

/**
 * 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;
    });
}
0
ответ дан 27 November 2019 в 19:52
поделиться

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

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"]
-1
ответ дан 27 November 2019 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: