#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) );
Комментариев нет:
Отправить комментарий