Как разделить массив на основе состояния элемента подмассива?

У меня есть массив, состоящий из подмассивов:

myArray  = [[info1, info2, info3, value1], [info1, info2, info3, value1], 
[info1, info2, info3, value1],.............]

Я хочу разбить массив на несколько массивов на основе «value1». Если значение1 превышает 1000 в более чем 5 последовательных элементах, я хочу создать новый массив:

mySubArray1 = [[info1, info2, info3, 1011], [info1, info2, info3, 
1012], [info1, info2, info3, 1011],.............]

и поэтому, если я обнаружу вторую серию элементов, где value1 превышает 1000 в более чем 5 последовательных элементах, я хочу создать еще один массив:

mySubArray2 = [[info1, info2, info3, 3030], [info1, info2, info3, 
4000], [info1, info2, info3, 1700],.............]

Я сделал следующее:

var j;
for (j = 0; j < array.length; j++) {
if (array[j][3] < 1000 ) {

    console.info("below 1000");
}
else {
    console.info("above 1000");
}

}

Это определяет, где значение выше 1000, но теперь мне нужно отсортировать его в новые массивы, и я не знаю, как запустить этот процесс.

Что такое info1, info2, info3 и т. д.? Это тоже все автономные переменные? (если вы хотели использовать строки, для строк нужны разделители). Вы также должны опубликовать код, который вы пробовали, но который не работает.

CertainPerformance 23.01.2019 08:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны быть в состоянии сделать Array.reduce, чтобы получить желаемый результат:

Я создаю массив, который должен быть похож на ваш ввод, значение «value1» будет между 995 и 1010.

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

let myArray  = [...Array(100).keys()].map(n => ['info1', 'info2', 'info3', getRandomInt(995, 1010)]);

console.info("Input: ", JSON.stringify(myArray));

let subArray = [];
// Result will contain a list of our new subarrays.
let result = myArray.reduce((acc, val, index) => {

   if (val[3] >= 1000) { 
      subArray.push(val);
   } 

   if ((val[3] < 1000) || (index === myArray.length - 1) /* Handle the case when we're at the end of myArray */ ) {
       if (subArray.length > 5) { 
           acc.push(subArray);
       } 
       subArray = [];
   }
 
   return acc;
}, [])

console.info("Result:");
result.forEach( (subArray, n) => console.info(`Subarray ${n+1}: `, subArray));

Спасибо. Я отчасти это понимаю, отчасти это работает. Но теперь, если длина последовательного ряда больше 5, он разобьет массив независимо от subArray.length = 5? Итак, если это серия из 8, она фактически создаст подмассив с 5... (Моя цель в этом случае - получить все 8 в одном и том же подмассиве). Я думаю, что что-то вроде этого может решить эту проблему: if (subArray.length > 5 && val[3]<1000) { acc.push(subArray); подмассив = []; }

otk 23.01.2019 09:07

Я обновил ответ новой логикой, он должен создавать подмассивы из 5+ элементов.

Terry Lennox 23.01.2019 09:32

Еще раз спасибо! Ряды длиннее 5 теперь добавляются к подмассивам. У него все еще может быть одна проблема: если последнее значение должно войти в подмассив, последний подмассив будет проигнорирован из-за: (index === myArray.length - 1) ........... ...(Я думаю).

otk 23.01.2019 09:37

Другие вопросы по теме