繁体   English   中英

在JavaScript上遍历2个数字范围

[英]Loop through 2 number ranges on javascript

我正在开发一种解决方案,在该解决方案上,我需要遍历两个单独的连续数字范围。 假设例如1到5和10到15。

我正在使用以下代码:

var X = [];

for (i = 1; i < 6; i++) {
  X.push(i);
}
for (i = 10; i < 16; i++) {
  X.push(i);
}

for (var x in X) {      
  console.log(parseInt(X[x]));
}

这段代码可以完成任务,但是有很多开销和不必要的操作:

  • 将时间填充到所需范围的数组
  • 通过索引访问元素以获取真实值(X [x])
  • 使用parseInt将值转换回整数(因为类型X [x]是字符串)

有没有更简单/更有效的方法来执行这种操作? 像这样:

for(x = 1 to 5, then x = 10 to 15) {
  // do something with x
}

限制条件:

  • 在内部使用具有相同代码的两个单独的循环没有用,因为此循环在代码的多个位置重复
  • 不希望将循环内容包装在函数中
  • 检查x边界并在循环内更新其值也不可取(我的意思是,检查x == 5并将其更改为10)

我已经搜索了SO,但找不到任何解决方案。

提前致谢!

您可以使用for..of循环, for循环,散布元素

 let res = []; for (let [from, to] of [[1, 6], [10, 16]]) for (let x = from; x < to; x++) console.log(x); res.push(x); console.log(res); 

如果要求仅在console记录数字,或者“ //用x做某事”而不在数组中存储“某物”的结果,则可以将javascript简化为

 for (let [from, to] of [[1, 6], [10, 16]]) for (let x = from; x < to; x++) console.log(x); // do stuff with `x` 

这不一定效率更高,但是可以使所有内容保持整洁并防止重复代码。

基本上,编写一个函数,该函数接受范围数组和在指定范围内的每次循环迭代中执行的回调。

如果需要,范围和当前索引将传递给回调。

function loop(ranges, callback) {
  ranges.forEach(function (range) {
    for (var i = range[0]; i <= range[1]; i++) callback(range, i);
  });
}

var ranges = [
  [1, 5],
  [10, 15],
];

var callback = function (range, i) {
  console.log(i);
}

loop(ranges, callback);

在ES6中,您可以创建一些生成器函数来抽象出循环细节,并使用for...of循环。 这样,您将拥有所需的可读语法,而不会创建任何大数组。

 function* ranges(...rangeDescriptors) { for (const [min, max, step = 1] of rangeDescriptors) for (let i = min; i < max; i += step) yield i; } for (const x of ranges([1, 6], [10, 16])) { console.log(x); } 

我只是清楚要添加到数组中的内容和范围。

遵循以下代码:

 var startAt = 1; var midStop = 6; var highStop = 16; var stopAt = 20; var X = []; for (i = startAt; i < stopAt; i++) { if (i < midStop || i > highStop) { X.push(i); } } var j = startAt; X.forEach(function(x) { console.log("[" + j++ + "]:" + x); }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM