2017-02-07 2 views
2

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

Скажем, есть несколько массивов, как [10, 20, 30] ["24-30", "45-60"] [34, 35] ["28-33", 90]

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

, например, для верхних значений я ожидать строку

[10, 20, "24-35", "45-60", 90] 

поэтому логика должна обнаружить, что, например, 30 уже включен в [24-30], что «28-33» продолжается и перекрывается с «24-30» и «28-33» продолжается одиночными значениями 34 и 35.

Возможно, кто-то знает библиотеку, которая меня поддерживает эта проблема или знает хорошее решение?

+0

просит библиотеки оффтоп. вы что-то пробовали? –

+0

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

ответ

1

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

var data = [[10, 20, 30], ["24-30", "45-60"], [34, 35], ["28-33", 90]], 
 
    result = data 
 
     .reduce(function (r, a) { 
 
      a.map(function (b) { 
 
       var c = b.toString().split('-') 
 
       c[1] = c[1] || c[0]; 
 
       r.push(c.map(Number)); 
 
      }); 
 
      return r; 
 
     }, []) 
 
     .sort(function (a, b) { return a[0] - b[0] || a[1] - b[1]; }) 
 
     .reduce(function (r, a) { 
 
      var last = r[r.length - 1] || []; 
 
      if (a[0] <= last[1] + 1) { 
 
       if (last[1] < a[1]) { 
 
        last[1] = a[1]; 
 
       } 
 
       return r; 
 
      } 
 
      return r.concat([a]); 
 
     }, []) 
 
     .map(function (a) { 
 
      return a[0] === a[1] ? a[0] : a.join('-'); 
 
     }); 
 
    
 
console.log(result);

+0

, который так быстро пришел в голову? Я чувствую себя просто глупо сейчас. Спасибо, Нина. Это именно то, что мне нужно. –

+0

без проблем. Я действительно пишу подход без сортировки в первую очередь, и последняя часть сокращения была моей отправной точкой. –

Смежные вопросы