Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

Как распределить числа из массива js

Задача такая:
var streak = { min: '', max: '', length: '', series: [] }
var allStreaks = []
У меня есть массив чисел:
var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9]
Мне нужно распределить их по массивам чтобы в нем были эти числа в порядке возрастания, и записать все это в таком формате:
[{ min: 19, max: 22, length: 4, series: [19, 20, 21, 22] }, { min: 17, max: 19, length: 3, series: [17, 18, 19] }, { min: 7, max: 9, length: 3, series: [7, 8, 9] }]
В исходном массиве числа идут в том порядке в котором они мне нужны будут (как будто если бы эти числа шли по датам - одно число - один день) Мне нужно отловить сколько "дней" эти числа увеличивались, с какого числа началось и на каком остановилось и потом все сначала. Первые 4 числа массива arr (19 20 21 22) должны создать объект в котором будет записано минимальное число (19), максимальное число (22), сколько всего чисел было записано (4) и собственно сам массив этих чисел [19, 20, 21, 22]. Точно так же со вторым возрастающим стриком с 17 до 19 итд Числа в исходном массиве абсолютно рандомные и нужно отследить эту череду увеличений и как только встречается число меньше предыдущего начать новый массив
На данный момент делаю так:
for (var i = 0; i < arr.length-1; i++) { if (arr[i] < arr[i+1]) { streak.series.push(arr[i]) } else { streak.series.push(arr[i]) //Сохранит последний элемент первого стрика break; } }
Так я успешно получаю первый стрик, однако если мне надо продолжить, то возникают трудности:
for (var i = 0; i < arr.length-1; i++) { if (arr[i] < arr[i+1]) { streak.series.push(arr[i]) } else if ((arr[i] > arr[i-1]) && (arr[i] > arr[i+1])) { streak.series.push(arr[i]) // Это ловит и записывает последний элемент первого стрика, получается steak.series = [19,20,21,22] // но он на этом не останавливается и продолжает записывать все числа исходного массива // так как они потом подходят под первый if (arr[i] < arr[i+1]) // и в результате у меня просто переписывается весь исходный массив } else {continue;} }


Ответ

var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9] var resArr = []; var min = max = length = 0; var tempArr = []; var prev = 0; arr.forEach(function(item) { if(prev > item && prev){ resArr.push({'min':min,'max':max,'length':length, 'series':tempArr}); min = 0; max = 0; tempArr = []; length = 0; } if(item > max) max = item; if(item < min || min == 0) min = item; length++; tempArr.push(item); prev = item; }); resArr.push({'min':min,'max':max,'length':length, 'series':tempArr}); console.log(resArr);

Комментариев нет:

Отправить комментарий