【问题标题】:Distinguish ranges in array, and expand them区分数组中的范围,并扩展它们
【发布时间】:2017-10-06 07:47:53
【问题描述】:

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

例如:

var arr = ["1", "6", "4", "5", "9-11", "13-15"];

而想要的输出是

var output =["1", "6", "4", "5", "9", "10", "11", "13", "14", "15"];

我目前有扩展某个范围的脚本。我很难识别数组中的范围:

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

【问题讨论】:

  • 我猜您必须以某种方式迭代该数组,您不能简单地检查包含- 的元素以查看它是否是一个范围吗? element.includes("-")(范围元素时为真)

标签: javascript arrays string loops range


【解决方案1】:

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

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 函数和concat 将结果传递给我们的输出数组,否则只传递push@987654326 中的值@数组。

【讨论】:

    【解决方案2】:

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

    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 方法来做到这一点

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

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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]
      

      【讨论】:

        【解决方案4】:

        看起来您可以通过是否包含“-”来区分范围,不是吗?

        arr.forEach((val) => {
            if (val.indexOf("-") > -1) {
                // do something here
            }
        })
        

        对于// do something here,你可以把你已经拥有的东西变成一个函数:

        function getArrayFromRange(range) {
            range = str.split("-");
        
            start = parseInt(range[0]);
            end = parseInt(range[1]);
        
            var rangeArray = [];
        
            for(var i = start; i <= end; i++){
                rangeArray.push(i);
            }
        
            return rangeArray;
        }
        

        您可以使用您的范围调用该函数,然后将返回的值插入arr 中的适当位置

        【讨论】:

          【解决方案5】:

          // the predefined array
          var arr = ["1", "6", "4", "5", "9-11", "13-15"];
          
          // new array will be this
          var output = [];
          
          // loop over each item in array
          for(i in arr){
            // if array has a '-' character in it
            if(arr[i].indexOf('-') > 0){
               // split the array into start and end range
               var split = arr[i].split('-');
               // loop through start and end
               for(var p = parseInt(split[0]); p < parseInt(split[1]) + 1; p++){
                   // push it to the new array
                   output.push(p.toString());
               }
            }else{
              // the item doesn't contain '-', push it directly
              output.push(arr[i].toString());
            }
          }
          console.log(output);

          【讨论】:

            【解决方案6】:

            对我来说,您似乎在追求这样的事情,但也许我错了:

            var arr = ["1", "6", "4", "9-11", "13-15"];
            
            var output =[
                [0, 1],
                [0, 1, 2, 3, 4, 5, 6],
                [0, 1, 2, 3, 4],
                [9, 10, 11],
                [13, 14, 15]
            ];
            
            var ranges = arr.map(function(item) {
                var range = item.split('-');
                if (range.length === 2) {
                    var start = parseInt(range[0]);
                    var end = parseInt(range[1]);
                } else {
                    start = 0;
                    end = parseInt(range[0]);
                }
                
                var rangeArray = [];
            
                for(var i = start; i <= end; i++){
                    rangeArray.push(i);
                }
                
                return rangeArray;
            });

            【讨论】:

              【解决方案7】:

              您可以使用 while 循环来返回范围的单个值。

              var array = ["1", "6", "4", "5", "9-11", "13-15"],
                  result = array.reduce(function (r, a) {
                      var p = a .split('-');
                      do {
                          r.push((p[0]++).toString());
                      } while (p[0] <= p[1])
                      return r;
                  }, []);
                  
              console.log(result);
              .as-console-wrapper { max-height: 100% !important; top: 0; }

              【讨论】:

                猜你喜欢
                • 2018-08-30
                • 2018-01-20
                • 1970-01-01
                • 2013-01-24
                • 2021-02-24
                • 1970-01-01
                • 1970-01-01
                • 2023-04-04
                • 1970-01-01
                相关资源
                最近更新 更多