#javascript #массивы #сортировка
Задача такая: 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;} }
Ответы
Ответ 1
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);Ответ 2
var allStreaks = []; var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9]; var prevMaxPos = 0; doWork(); console.log(allStreaks); // функции работы и заноса в итоговый массив function doWork() { for (var i = 1; i < arr.length; ++i) { if (arr[i] < arr[i - 1]) { allStreaks.push(setStreak(arr.slice(prevMaxPos, i))); prevMaxPos = i; } } if (arr.slice(prevMaxPos).length > 0) allStreaks.push(setStreak(arr.slice(prevMaxPos))); } function setStreak(arr) { return streak = { min: arr[0], max: arr[arr.length - 1], length: arr.length, series: arr } }Ответ 3
решение в стиле минимализм ... var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9]; function go(d) { var a; return d.reduce(function(c, b) { a && b == a.max + 1 ? (a.max = b, a.length++, a.series.push(b)) : (a = { min: b, max: b, length: 1, series: [b] }, c.push(a)); return c }, []) }; console.log(go(arr))Ответ 4
ещё одно минималистическое, но читаемое решение var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9], distribute = function(arr) { var out = [], series = [], i = 1; while (i < arr.length + 1) { series.push( arr[i-1] ); if (! (arr[i-1] < arr[i++])) { out.push({ min: series[0], max: series[series.length-1], length: series.length, series: series.slice() }); series = []; } } return out; } console.log( distribute(arr) );
Комментариев нет:
Отправить комментарий