Страницы

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

воскресенье, 8 марта 2020 г.

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

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

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

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