在Javascript/jQuery中创建两个数字之间所有整数的数组,包括在内

40 *_*Day 119 javascript arrays jquery

说我有以下复选框:

<input type="checkbox" value="1-25" />
Run Code Online (Sandbox Code Playgroud)

要获得定义我正在寻找的范围边界的两个数字,我使用以下jQuery:

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

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

[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]
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 157

var list = [];
for (var i = lowEnd; i <= highEnd; i++) {
    list.push(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 而对于一般信息,在CoffeeScript中,它看起来像"1..25",实际上在JavaScript中转换为类似的东西.所以没有更简单的方法来做到这一点. (9认同)
  • @FreeCandies - 是的,CoffeeScript有这种便利,但你仍然需要通过编译器来运行 - 慢或不方便,你仍然无法掌握如何手动完成它.我真诚地希望我们不会用"只使用CoffeeScript"取代'just use jQuery'时代 (4认同)
  • 注意,正确的coffeescript符号是[1..25] (2认同)

m59*_*m59 78

在JavaScript ES6中:

function range(start, end) {
  return Array(end - start + 1).fill().map((_, idx) => start + idx)
}
var result = range(9, 18); // [9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
console.log(result);
Run Code Online (Sandbox Code Playgroud)

为了完整性,这里有一个可选step参数.

function range(start, end, step = 1) {
  const len = Math.floor((end - start) / step) + 1
  return Array(len).fill().map((_, idx) => start + (idx * step))
}
var result = range(9, 18, 0.83);
console.log(result);
Run Code Online (Sandbox Code Playgroud)

我会用range-inclusiveNPM在实际的项目.它甚至支持向后的步骤,所以这很酷.

  • 太糟糕了`移动浏览器(尚未)支持`fill()`. (2认同)
  • Array.from({length:256},(v,k)=&gt;k++) 更好:D (2认同)

Eri*_*ulz 36

我强烈推荐下划线或lo-dash库:

http://underscorejs.org/#range

(几乎完全兼容,显然lodash运行得更快,但下划线有更好的doco恕我直言)

_.range([start], stop, [step])
Run Code Online (Sandbox Code Playgroud)

这两个库都有很多非常有用的实用程序.


Abd*_*UMI 30

用例

var genArr=(1)['..'](10)  //[1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

API;

Number.prototype['..']=function(to,step){
     var arr = [],from=this;
     while(from <= to){
        arr.push(from++);
     }
     return arr;
};
Run Code Online (Sandbox Code Playgroud)

FIDDLE:

http://jsfiddle.net/abdennour/mcpnvsmm/


ES6:

console.log(
   Array.from({length:10},(v,k)=>k+1)
)
Run Code Online (Sandbox Code Playgroud)

  • 当问题是如何获得两个数字之间的范围时,这个答案有何相关性? (14认同)
  • ..then , ... : `(1)['..'](10).forEach(function(e){console.log(e)})`。. 例如 (2认同)
  • 天哪,javascript 中的 lambda 表达式!谢谢(你的)信息。但请注意,这里他们说明了为什么人们也应该将正文放入括号中:https://www.vinta.com.br/blog/2015/javascript-lambda-and-arrow-functions/ 就像 `(v,k) =&gt;(k+1)` (2认同)
  • 这里描述了使用“Array.from”在两个数字之间创建序列:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#sequence_generator_range (2认同)

Pav*_*sky 28

我的循环版本;)

var lowEnd = 1;
var highEnd = 25;
var arr = [];
while(lowEnd <= highEnd){
   arr.push(lowEnd++);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个方法远远超过所选择的答案,仅供参考. (4认同)
  • 如果使用`var arr = new Array(highEnd - lowEnd + 1)`那将会快几倍. (3认同)

coc*_*cco 19

最快的方式

  1. while--在大多数浏览器上更快
  2. 直接设置变量比推动更快

功能:

var x=function(a,b,c,d){d=[];c=b-a+1;while(c--){d[c]=b--}return d},

theArray=x(lowEnd,highEnd);
Run Code Online (Sandbox Code Playgroud)

要么

var arr=[],c=highEnd-lowEnd+1;
while(c--){arr[c]=highEnd--}
Run Code Online (Sandbox Code Playgroud)

编辑

可读版本

var arr = [],
c = highEnd - lowEnd + 1;
while ( c-- ) {
 arr[c] = highEnd--
}
Run Code Online (Sandbox Code Playgroud)

演示

http://jsfiddle.net/W3CUn/

对于下行者

性能

http://jsperf.com/for-push-while-set/2

在Firefox中速度更快,速度提高3倍

只有在aipad air上,for循环才会快一点.

在win8,osx10.8,ubuntu14.04,ipad,ipad air,ipod上测试;

与铬,ff,即野生动物园,移动野生动物园.

我想看看旧版ie浏览器的性能,其中for循环没有优化!

  • 这些都是很棒的想法...但是我会尝试使用适当的缩进,字间距和换行符让其他人更容易阅读您的代码. (4认同)

dav*_*zen 11

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

这大致相当于

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;
}
Run Code Online (Sandbox Code Playgroud)

打破它:

var targetLength = (k - j) + 1;

var a = Array(targetLength);
Run Code Online (Sandbox Code Playgroud)

这将创建一个正确标称长度的稀疏矩阵.现在稀疏矩阵的问题是虽然它具有正确的标称长度,但它没有实际的元素,因此,对于

j = 7, k = 13

console.log(a);
Run Code Online (Sandbox Code Playgroud)

给我们

Array [ <7 empty slots> ]
Run Code Online (Sandbox Code Playgroud)

然后

var b = Array.apply(null, a);
Run Code Online (Sandbox Code Playgroud)

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

所以现在,

 console.log(b);
Run Code Online (Sandbox Code Playgroud)

产量

 Array [ undefined, undefined, undefined, undefined, undefined, undefined, undefined ]
Run Code Online (Sandbox Code Playgroud)

最后

var c = b.map(function(_, n){ return n + j; });
Run Code Online (Sandbox Code Playgroud)

利用Array.map函数传递的事实:1.当前元素的值和2.当前元素的索引,映射委托/回调.第一个参数被丢弃,而第二个参数可用于在调整起始偏移量后设置正确的序列值.

那么

console.log(c);
Run Code Online (Sandbox Code Playgroud)

产量

 Array [ 7, 8, 9, 10, 11, 12, 13 ]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您发布此问题的答案!Stack Overflow不鼓励使用仅代码的答案,因为原始海报(或未来的读者)很难理解它们背后的逻辑.请编辑您的问题,并附上您的代码说明,以便其他人可以从您的答案中受益.谢谢! (4认同)

Fla*_*che 9

纯ES6的解决方案

\n

受到上面 m59 答案的启发,但不依赖于fill

\n
const range = (start, stop) => Array.from({ length: stop - start + 1 }, (_, i) => start + i)\n
Run Code Online (Sandbox Code Playgroud)\n

所以你可以这样使用它:

\n
range(3,5)\n=>\xc2\xa0[3, 4, 5]\n
Run Code Online (Sandbox Code Playgroud)\n


Igo*_*gor 6

function createNumberArray(lowEnd, highEnd) {
    var start = lowEnd;
    var array = [start];
    while (start < highEnd) {
        array.push(start);
        start++;
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • `var array = {start};` 为您提供了一个没有 `push` 方法的标准对象。你的意思是`var array = [];`肯定 (2认同)

drj*_*nco 6

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

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]
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*lov 5

我的五分钱:

两个方向的整数数组函数。

range(0, 5)变为[0, 1, 2, 3, 4, 5].

range(5, 0)变为[5, 4, 3, 2, 1, 0].

基于这个答案。

function range(start, end) {
  const isReverse = (start > end);
  const targetLength = isReverse ? (start - end) + 1 : (end - start ) + 1;
  const arr = new Array(targetLength);
  const b = Array.apply(null, arr);
  const result = b.map((discard, n) => {
    return (isReverse) ? n + end : n + start;
  });

  return (isReverse) ? result.reverse() : result;
}
Run Code Online (Sandbox Code Playgroud)

PS 要在现实生活中使用,您还应该检查isFinite()和 的参数isNaN()