我正在尝试制作一个程序,如果我给出
["1-5"]
,则返回 [1,2,3,4,5]
。
我已经做到了,但无法过滤。所以我想要一个能够“过滤我的输出代码”的代码。或者任何比我的更好的代码。 这是我尝试过的,但没有达到预期效果。如果有一个序列,数组应该压入序列的第一个和最后一个数字,中间有一个连字符。
例如在下面的代码中:数组是
[1,2,3, 5,6,7,8, 10,11, 34, 56,57,58]
。
这里 (1,2,3), (5,6,7,8) 是序列。所以代码应该输出["1-3", "5-8", like so]
。
但是我的代码给出了以下输出:["1-1","1-2","1-3","5-6","5-7","5-8", like so]
let array = [1,2,3,5,6,7,8,10,11,34,56,57,58];
let x = [];
for(let i = 0; i < array.length; i++){
for(let j = 0; j < array.length; j++){
if(array[i] + j == array[j]){
x.push(array[i] + "-" + array[j]);
}
if(array[j] > array[i] + j && array[j + 1]){
let y = array.slice(j, array.length)
array = y;
i, j = 0;
}
if(array[i] - array[i + 1] != -1 && array[i + 1] - array[i] != 1 && array[i + 1] != undefined){
x.push(array[i]);
}
}
}
console.log(x);
尝试找到整个数组的范围或
function detectRange(a) {
// clone a
const b = [...a]
// remove first value
const min = max = b.splice(0, 1)[0]
// compute range
const range = b.reduce(({min, max}, i) => {
if(i < min) min = i
if(i > max) max = i
return { min, max }
}, {min, max})
return range
}
function detectRanges(a) {
// clone a
const b = [...a]
// remove first value
const min = max = b.splice(0, 1)[0]
// init ranges array
const ranges = [ ]
// compute ranges
const range = b.reduce(({min, max}, i) => {
if(i === max + 1) {
return {min , max: i}
} else {
ranges.push({min, max})
return {min: i, max: i}
}
}, {min, max})
// push the remaining range onto the array
ranges.push(range)
return ranges
}
function printRange(r) {
console.log(`["${r.min}-${r.max}"]`)
}
function printRanges(r) {
r.forEach(i => {
printRange(i)
})
}
// detect and print range of whole array
printRange(detectRange([1, 2, 3, 5, 6, 7, 8, 10, 11, 34, 56, 57]))
// detect and print only contiguous ranges within array
printRanges(detectRanges([1, 2, 3, 5, 6, 7, 8, 10, 11, 34, 56, 57]))
为了简化事情,我使用了 ES6 字符串插值
${start}-${last}
。
let array = [1,2,3,5,6,7,8,10,11, 34, 56,57];
let result = [ ];
let hasStart = false;
let start = 0;
let last = 0;
for (let num of array) {
if (!hasStart) {
hasStart = true;
last = start = num;
continue;
}
if (num === last + 1) {
last = num;
continue;
}
result.push( start === last ? start : `${start}-${last}` );
last = start = num;
}
if (hasStart) {
result.push( start === last ? start : `${start}-${last}` );
}
console.log(result);
输出:[“1-5”]
所以我假设你想获取以下格式的字符串:
["smallestelement-largestelement"]
var input1 = [1,2,3,4,5]
console.log( "["+'"'+Math.min(...input1)+"-"+Math.max(...input1)+'"'+"]")
如果您想要的是格式为字符串:
["firstelement-lastelement"]
var input1 = [1,2,3,4,5]
console.log( "["+'"'+input1[0]+"-"+input1.pop()+'"'+"]")
(你也可以提供排序规则)并使用
shift()
作为第一个元素,使用
slice(-1)
最后:
let arr = [4,1,5,3].sort();
console.log(arr.shift()+'-'+arr.slice(-1));
正如评论中所述,您应该澄清您是否希望
"1-57"
使用片段数组,或者更广泛地描述您的用例。
const array = [1, 2, 3, 5, 6, 7, 8, 10, 11, 34, 56, 57];
let s = null;
const result = array.sort((a, b) => a - b).reduce((p, c, i, arr) => {
if (!s) s = c;
if (c + 1 !== arr[i + 1]) {
p.push(s === c ? s : `${s}-${c}`);
s = null;
}
return p
}, [])
console.log(result);