NullPointerException
. Это плохая практика. Лучше убедиться, что значение не равно нулю. Вы можете сделать свою собственную повторно используемую функцию, я полагаю, для вашего примера:
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, поэтому вы можете использовать его без. Вы просто ничего не получаете из библиотеки за что-то вроде этого:)
Последовательность - это поток, который вычисляет значение, когда это необходимо. Это требует только немного памяти, но больше процессорного времени, когда используются значения.
Массив - это список предварительно вычисленных значений. Это займет некоторое время, прежде чем можно будет использовать первое значение. И это требует много памяти, потому что все возможные значения последовательности должны храниться в памяти. И вы должны определить верхний предел.
Это означает, что в большинстве случаев не стоит создавать массив со значениями последовательности. Вместо этого лучше реализовать последовательность как реальную последовательность, которая ограничена только длиной слова процессора.
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
Если вы используете более новый синтаксис Javascript, то же самое может быть достигнуто с помощью:
Array(8).fill(1)
Следующее тоже хорошо работает, но, как указал Мэтт, ключевое слово «new» является избыточным.
new Array(8).fill(1)
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
*/
Один лайнер:
new Array(10).fill(1).map( (_, i) => i+1 )
Выходы:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
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)
}
2016 год - появилась функциональность современного браузера. Нет необходимости в jquery все время.
Array.from({length: 8}, (el, index) => 1 /* or index */);
Вы можете заменить функцию стрелки на простую функцию обратного вызова, чтобы охватить чуть более широкий диапазон поддерживаемых браузеров. По крайней мере, для меня это самый простой способ перебора инициализированного массива за один шаг.
Примечание: IE не поддерживается в этом решении, но для этого есть поли-заполнитель на developer.mozilla.org / ...
Если вы, как и я, часто используете 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.
Метод машинописного текста на основе кода Арии Хидаят:
/**
* 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;
});
}
Почему бы не просто объединить и разделить?
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"]