2017-10-06 43 views
1

我需要区分数组中的范围,并将其展开。我正在使用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); 
+2

我想你必须以某种迭代数组,不能你只需检查一个包含'-'元素,看它是否是一个范围? 'element.includes(“ - ”)'(当range元素为true时) – xander

回答

0

看起来你可以区分一个范围,如果它包含“ - ”,否?

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的适当位置

1

试试这种方法。循环访问数组并检查该项是否包含-符号,如果是,则将其拆分并获取范围。遍历范围并将每个项目添加到数组中。否则,只需添加该项目。对于这种逻辑,您还可以创建一个帮助器函数,该函数返回给定范围内的数组,并使用原始数组范围返回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);

1

我更新了你的代码,使一个splitRanges函数返回人气指数的所有号码,并在最初的数组上循环使用该功能,以提取的所有范围在每次迭代中:

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数组中的值output

0

您可以简单地遍历数组,并使用此代码的一部分,当你有一个范围:

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

 
for(var j=0;j<arr.length;j++) { 
 

 
    if(arr[j].search("-")!=-1) { 
 
    range = arr[j].split("-"); 
 

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

 
    for(var i = start; i <= end; i++){ 
 
     output.push(i); 
 
    } 
 
    } else { 
 
    output.push(parseInt(arr[j])); 
 
    } 
 

 
} 
 
console.log(output);

0

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

1

你可以这样做像这样:

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] 
0

对于我来说,它看起来像你这样的事情之后,但也许我错了:

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

0

你可能需要一段时间循环返回范围的单一值。

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

相关问题