假设我有以下复选框:

<input type="checkbox" value="1-25" />

为了得到定义我正在寻找的范围边界的两个数字,我使用下面的jQuery:

var value = $(this).val();
var lowEnd = Number(value.split('-')[0]);
var highEnd = Number(value.split('-')[1]);

然后,我如何创建一个包含lowEnd和highEnd之间的所有整数的数组,包括lowEnd和highEnd本身?对于这个特定的例子,显然,结果数组将是:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]

当前回答

function range(j, k) { 
    return Array
        .apply(null, Array((k - j) + 1))
        .map(function(_, n){ return n + j; }); 
}

这大致相当于

function range(j, k) { 
    var targetLength = (k - j) + 1;
    var a = Array(targetLength);
    var b = Array.apply(null, a);
    var c = b.map(function(_, n){ return n + j; });
    return c;
}

分解一下:

var targetLength = (k - j) + 1;

var a = Array(targetLength);

这将创建一个具有正确标称长度的稀疏矩阵。现在,稀疏矩阵的问题是尽管它有正确的标称长度,但它没有实际的元素,所以,对于

j = 7, k = 13

console.log(a);

给了我们

Array [ <7 empty slots> ]

Then

var b = Array.apply(null, a);

将稀疏矩阵作为参数列表传递给Array构造函数,该构造函数生成一个(实际)长度为targetLength的密集矩阵,其中所有元素都具有未定义的值。第一个参数是数组构造函数执行上下文的“this”值,在这里没有作用,因此为null。

现在,

 console.log(b);

收益率

 Array [ undefined, undefined, undefined, undefined, undefined, undefined, undefined ]

最后

var c = b.map(function(_, n){ return n + j; });

利用了数组。映射函数通过:当前元素的值和2。当前元素的索引,映射委托/回调。第一个参数将被丢弃,而第二个参数在调整开始偏移量后可用于设置正确的序列值。

然后

console.log(c);

收益率

 Array [ 7, 8, 9, 10, 11, 12, 13 ]

其他回答

var values = $(this).val().split('-'),
    i = +values[0],
    l = +values[1],
    range = [];

while (i < l) {
    range[range.length] = i;
    i += 1;
}

range[range.length] = l;

可能有一个烘干机的方式来做循环,但这是基本的想法。

在下划线中求解

data = [];
_.times( highEnd, function( n ){ data.push( lowEnd ++ ) } );

ES6:

使用Array.from (docs here):

console.log ( Array.from({长度:5},(v, k) = > k + 1) )

我的循环版本;)

var lowEnd = 1;
var highEnd = 25;
var arr = [];
while(lowEnd <= highEnd){
   arr.push(lowEnd++);
}

如果开始总是小于结束,我们可以这样做:

function range(start, end) {
  var myArray = [];
  for (var i = start; i <= end; i += 1) {
    myArray.push(i);
  }
  return myArray;
};
console.log(range(4, 12));                 // → [4, 5, 6, 7, 8, 9, 10, 11, 12]

如果我们希望能够使用第三个参数来修改用于构建数组的步骤,并且即使开始值大于结束值也能使其工作:

function otherRange(start, end, step) {
  otherArray = [];
  if (step == undefined) {
    step = 1;
  };
  if (step > 0) {
    for (var i = start; i <= end; i += step) {
      otherArray.push(i);
    }
  } else {
    for (var i = start; i >= end; i += step) {
      otherArray.push(i);
    }
  };
  return otherArray;
};
console.log(otherRange(10, 0, -2));        // → [10, 8, 6, 4, 2, 0]
console.log(otherRange(10, 15));           // → [10, 11, 12, 13, 14, 15]
console.log(otherRange(10, 20, 2));        // → [10, 12, 14, 16, 18, 20]

这样,函数接受正步长和负步长,如果没有给出步长,则默认为1。