如果JavaScript中的数组是[1,2,3,4,5],如何返回“1-5”?

问题描述 投票:0回答:5

我正在尝试制作一个程序,如果我给出

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

javascript arrays sorting filter filtering
5个回答
1
投票

尝试找到整个数组的范围或
  1. 尝试在数组中查找连续范围
  2. 根据这些解释,你可以回答如下问题:

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


0
投票

为了简化事情,我使用了 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);


0
投票

输出:[“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()+'"'+"]")


0
投票

sort()

(你也可以提供排序规则)并使用 
shift()
 作为第一个元素,使用 
slice(-1)
 最后:

let arr = [4,1,5,3].sort(); console.log(arr.shift()+'-'+arr.slice(-1));

正如评论中所述,您应该澄清您是否希望

"1-57"

使用片段数组,或者更广泛地描述您的用例。

    


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.