关于jquery:如何在javascript中生成数字/字符序列?

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; })

解释如下。

Array(8)生成一个包含8个元素的稀疏数组,所有undefined元素。apply技巧将把它变成密集的阵列。最后,我们用map代替undefined的值(与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。


range(start,end,step):带ES6迭代器

您可以轻松地创建range()生成器函数,该函数可以作为迭代器使用。这意味着您不必预先生成整个数组。

1
2
3
4
5
6
7
8
function * range ( start, end, step ) {
  let state = start;
  while ( state < end ) {
    yield state;
    state += step;
  }
  return;
};

现在,您可能需要创建一些东西,通过迭代器预先生成数组并返回一个列表。这对于接受数组的函数很有用。为此,我们可以使用Array.from()

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"]