Как я могу вернуть «1-5», если массив [1,2,3,4,5] в JavaScript?

Я пытаюсь сделать программу, которая возвращает ["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,3,4,5, 8,9,10]? Или [1,2,3,4,5,12]? Или даже [1,3,4,5]? Массив в вашем вопросе кажется более сложным, чем массив в вашем вопросе, и вы не объяснили или даже не показали ожидаемый результат.

David Thomas 11.11.2022 07:46

Или [1,2,5,3]?

toffler 11.11.2022 07:47

Вывод выглядит неправильно. Почему ваша программа выводит "1-1", "1-2" и "1-3"? Это не имеет смысла.

Stephen Quan 11.11.2022 08:26
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Создайте титры как в звездных войнах с помощью CSS и Javascript
Создайте титры как в звездных войнах с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
0
3
108
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ввод: [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}`)

Пожалуйста, добавьте описание к вашему ответу, чтобы он стал более значимым и для других.

MarmiK 14.11.2022 06:56

Если у вас есть целочисленный массив, и если вы хотите вывести диапазон, вы можете изначально 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);

Формулировка вопроса несколько затрудняет ответ, но, основываясь на вашем фрагменте кода, я могу сделать вывод, что вы либо:

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

Другие вопросы по теме

Отфильтруйте массив по его ключам даты, чтобы сохранить только последний день года-месяца.
Сортировка многомерного массива по динамическому ключу
TEXTSPLIT в сочетании с BYROW возвращает неожиданный результат при использовании массива строк в качестве входных данных.
Как заставить ['1 0', '2 0', '3 1 2'] быть [[1, 0], [2,0], [3,1], [3,2]] так что я может распаковать значения. Питон. Список смежности
Суммируйте значения в многомерном массиве в С++ и сохраните его в другом многомерном массиве
Используйте цикл и инструкцию xchg на языке ассемблера, чтобы поменять местами элемент в массиве
Возвращает массив целых чисел со значениями, превышающими пороговое значение
Как преобразовать RenderTexture в массив 1D?
Способ представления некоторого «байта» заданным целым числом
Как сгруппировать массив объектов по одинаковым значениям идентификатора и даты?