Я пытаюсь сделать программу, которая возвращает ["1-5"], если я даю [1,2,3,4,5].
Я сделал это, но я не могу его отфильтровать. Поэтому мне нужен код, который будет фильтровать мой выходной код. Или любой код, который лучше моего.
let array = [1,2,3,5,6,7,8,10,11, 34, 56,57,];
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.info(x);
Или [1,2,5,3]?
Вывод выглядит неправильно. Почему ваша программа выводит "1-1", "1-2" и "1-3"? Это не имеет смысла.
Ввод: [1,2,3,4,5]
Вывод: ["1-5"]
Итак, я предполагаю, что вы хотите получить строку в формате: ["smallestelement-largestelement"]
var input1 = [1,2,3,4,5]
console.info( "["+'"'+Math.min(...input1)+"-"+Math.max(...input1)+'"'+"]")
Если вам нужна строка в формате: ["firstelement-lastelement"]
var input1 = [1,2,3,4,5]
console.info( "["+'"'+input1[0]+"-"+input1.pop()+'"'+"]")
let min = Number.MAX_VALUE
let max = Number.MIN_VALUE
arr.forEach((element) => {
if (element > max) max = element
if (element < min) min = element
}
console.info(`${min} - ${max}`)
Пожалуйста, добавьте описание к вашему ответу, чтобы он стал более значимым и для других.
Если у вас есть целочисленный массив, и если вы хотите вывести диапазон, вы можете изначально sort() его (вы также можете указать правила для сортировки) и использовать shift() для первого элемента и slice(-1) для последнего:
let arr = [4,1,5,3].sort();
console.info(arr.shift()+'-'+arr.slice(-1));
Как сказано в комментариях, вы должны уточнить, хотите ли вы "1-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.info(result);
Формулировка вопроса несколько затрудняет ответ, но, основываясь на вашем фрагменте кода, я могу сделать вывод, что вы либо:
Основываясь на этих интерпретациях, вы могли бы ответить на этот вопрос следующим образом:
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.info(`["${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]))
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.info(result);
А что, если подарить [1,2,3,4,5, 8,9,10]? Или [1,2,3,4,5,12]? Или даже [1,3,4,5]? Массив в вашем вопросе кажется более сложным, чем массив в вашем вопросе, и вы не объяснили или даже не показали ожидаемый результат.