首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分数组中的范围,并扩展它们

区分数组中的范围,并扩展它们
EN

Stack Overflow用户
提问于 2017-10-06 15:47:53
回答 7查看 71关注 0票数 1

我需要区分数组中的范围,并扩展它。我使用的是JavaScript。

例如:

代码语言:javascript
复制
var arr = ["1", "6", "4", "5", "9-11", "13-15"];

并且期望的输出是

代码语言:javascript
复制
var output =["1", "6", "4", "5", "9", "10", "11", "13", "14", "15"];

我目前有扩展某个范围的脚本。我在识别数组中的范围时遇到了困难:

代码语言:javascript
复制
var range = "1-6";
range = str.split("-");

start = parseInt(range[0]);
end = parseInt(range[1]);

var rangeArray = [];

for(var i = start; i <= end; i++){
    rangeArray.push(i);
}
console.log(rangeArray); 
EN

回答 7

Stack Overflow用户

发布于 2017-10-06 15:56:03

尝试这种方法。循环遍历数组并检查项是否包含-符号,如果包含,则拆分它并获取范围。循环遍历范围并将每一项添加到数组中。否则,只需添加该项目。对于这个逻辑,您还可以创建一个helper函数,该函数返回给定范围内的数组,并使用该范围内的原始数组返回concat

代码语言:javascript
复制
const arr = ["1", "6", "4", "5", "9-11", "13-15"];
let newArray = [];

function getRange(start, count) {
   const arr = [];
   for(let i = start; i <= count; i++) {
       arr.push(i.toString());
   }  
   return arr;
}

arr.forEach(item => {
  if(item.includes('-')) {    
    const [start, end] = item.split('-').map(n => parseInt(n));
    newArray = newArray.concat(getRange(start,end));
  } else {
    newArray.push(item);
  }
});

console.log(newArray);

您也可以使用reduce方法来完成此操作

代码语言:javascript
复制
const arr = ["1", "6", "4", "5", "9-11", "13-15"];

function getRange(start, count) {
   const arr = [];
   for(let i = start; i <= count; i++) {
       arr.push(i.toString());
   }   
   return arr;
}

const newArray = arr.reduce( (arr, item) => {
  if(item.includes('-')) {  
    const [start, end] = item.split('-').map(n => parseInt(n));
    arr = arr.concat(getRange(start, end));
  } else {
    arr.push(item);
  }  
  return arr;
}, []);

console.log(newArray);

票数 1
EN

Stack Overflow用户

发布于 2017-10-06 15:58:04

我更新了您的代码,使splitRanges函数返回arange中的所有数字,并循环遍历初始数组,并使用此函数在每次迭代中提取所有范围:

代码语言:javascript
复制
var arr = ["1", "6", "4", "5", "9-11", "13-15"]

function splitRanges(rangeStr) {
  var range = rangeStr.split("-");
  var start = parseInt(range[0]);
  var end = parseInt(range[1]);
  var rangeArray = [];

  for (var i = start; i <= end; i++) {
    rangeArray.push(""+i+"");
  }
  return rangeArray;
}

var output = [];

arr.forEach(function(r){
    if(r.indexOf("-")>-1){
      output = output.concat(splitRanges(r));
    }else
      output.push(r);
});
console.log(output);

说明:

这段代码循环遍历初始数组,并在每次迭代中检查它是否是一个范围,将该值传递给splitRanges函数,并将结果传递给我们的输出数组,否则只需将值pushoutput数组中。

票数 1
EN

Stack Overflow用户

发布于 2017-10-06 16:04:09

你可以这样做:

代码语言:javascript
复制
let arr = ["1", "6", "4", "5", "9-11", "13-15"];
let out = [];
const range = (start, end) => Array.from({length: (end - start)}, (v, k) => k + start);
arr.forEach(item => {
   let splitted = item.split('-');
    if(splitted.length > 1) {
        out.push(...range(parseInt(splitted[0]), parseInt(splitted[1]) + 1));
    } else {
        out.push(parseInt(item))
    }
})
console.log('out: ', out); // [1, 6, 4, 5, 9, 10, 11, 13, 14, 15]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46600825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档