How to generate sequence of numbers/chars in javascript?
有没有在javascript中生成字符或数字序列的方法?
例如,我想创建一个包含8个1的数组,我可以用for循环来实现,但是我想知道是否有一个jquery库或javascript函数可以为我实现它?
如果没有for循环,下面是一个解决方案:
1 | Array.apply(0, Array(8)).map(function() { return 1; }) |
解释如下。
1 | for (var i=8, a=[]; i--;) a.push(1); |
我想您可以使用自己的可重用函数,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
然后你可以这样做:
1 2 3 | var myArray = makeArray(8, 1); //or something more complex, for example: var myArray = makeArray(8, function(i) { return i * 3; }); |
您可以在这里尝试一下,注意上面的示例完全不依赖jquery,因此您可以在不使用它的情况下使用它。你只是不能从图书馆里得到任何东西。
如果您使用的是较新的javascript语法,则可以使用以下方法实现:
1 | Array(8).fill(1) |
下面的工作也很好,但正如马特指出的,关键字"new"是多余的。
1 | new Array(8).fill(1) |
使用jQuery:
1 | $.map($(Array(8)),function(val, i) { return i; }) |
这种回报:
1 | [0, 1, 2, 3, 4, 5, 6, 7] |
1 | $.map($(Array(8)),function() { return 1; }) |
这种回报:
1 | [1, 1, 1, 1, 1, 1, 1, 1] |
2016年-现代浏览器功能已推出。不需要一直使用jquery。
1 | Array.from({length: 8}, (el, index) => 1); |
您可以用一个简单的回调函数替换arrow函数,以访问更广泛的受支持浏览器。至少对我来说,这是在一个步骤中迭代初始化数组的最简单方法。
注意:此解决方案不支持IE,但developer.mozilla.org/上有一个polyfill。
序列是一个流,它在需要时计算值。当使用这些值时,这只需要一个位内存,但需要更多的CPU时间。
数组是预计算值的列表。这需要一些时间才能使用第一个值。它需要大量的内存,因为序列的所有可能值都必须存储在内存中。你必须定义一个上限。
这意味着,在大多数情况下,创建具有序列值的数组是不明智的。相反,最好将序列实现为实际序列,而实际序列仅受CPU字长的限制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 | new Array(10).fill(1).map( (_, i) => i+1 ) |
产量:
1 | [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] |
在JavaScript中,生成一个整数序列绝对应该更加方便。这里是一个递归函数,返回一个整数数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 | function intSequence(start, end, n = start, arr = []) { return n === end ? arr.concat(n) : intSequence(start, end, start < end ? n + 1 : n - 1, arr.concat(n)); } $> intSequence(1, 1) <- Array [ 1 ] $> intSequence(1, 3) <- Array(3) [ 1, 2, 3 ] $> intSequence(3, -3) <- Array(7) [ 3, 2, 1, 0, -1, -2, -3 ] |
如果像我一样,你经常使用linspace,你可以像这样轻松地修改linspace的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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。
您可以轻松地创建
1 2 3 4 5 6 7 8 | function * range ( start, end, step ) { let state = start; while ( state < end ) { yield state; state += step; } return; }; |
现在,您可能需要创建一些东西,通过迭代器预先生成数组并返回一个列表。这对于接受数组的函数很有用。为此,我们可以使用
1 | const generate_array = (start,end,step) => Array.from( range(start,end,step) ); |
现在您可以轻松地生成静态数组,
1 | const array = generate_array(1,10,2); |
但是,当某个东西需要一个迭代器(或者给您使用迭代器的选项)时,您也可以轻松地创建一个迭代器。
1 2 3 | for ( const i of range(1, Number.MAX_SAFE_INTEGER, 7) ) { console.log(i) } |
基于Ariya Hidayat代码的类型脚本方法:
1 2 3 4 5 6 7 8 9 10 11 12 | /** * 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; }); } |
为什么不只是简单的连接和拆分呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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"] |