Как сгруппировать json только по последовательным значениям в массив

#javascript #jquery

Вопрос:

Итак, я пытаюсь сгруппировать эти значения, где раздел и строка совпадают и имеют последовательный порядок начала и конца, я знаю, что могу использовать функцию уменьшения. Я перепробовал все, просто не могу понять

  const y = [{sec: "100", row: "12", startSeat: 1, endSeat: 2},
            {sec: "125", row: "10", startSeat: 1, endSeat: 2},
            {sec: "125", row: "10", startSeat: 3, endSeat: 4},
            {sec: "125", row: "10", startSeat: 9, endSeat: 10}];
 

так, например, есть 3 элемента с разделом «125», но только 2 из них имеют последовательные места, 1,2,3,4, один с 9,10 имеет тот же раздел, но не является последовательным, я хочу, чтобы только те, которые последовательно сгруппированы в массив. Мой новый массив должен выглядеть так

           [{sec: "125", row: "10", startSeat: 1, endSeat: 2},
           {sec: "125", row: "10", startSeat: 3, endSeat: 4}]
 

все остальное следует игнорировать

    var result =y.reduce( (previousValue, currentValue, currentIndex, a) => {
    
   if (!currentIndex || (currentValue.startSeat - a[currentIndex - 1].endSeat === 
    1))previousValue.push([]);

   previousValue[previousValue.length - 1].push(currentValue);

   return previousValue;
   }, []);

   console.log(result);
 

Ответ №1:

Вы могли бы попробовать что-то вроде этого:

 const y = [{sec: "100", row: "12", startSeat: 1, endSeat: 2},
            {sec: "125", row: "10", startSeat: 1, endSeat: 2},
            {sec: "125", row: "10", startSeat: 3, endSeat: 4},
            {sec: "125", row: "10", startSeat: 5, endSeat: 6},
            {sec: "125", row: "10", startSeat: 9, endSeat: 10}];

let x = [];
y.forEach(function(element, index, arr) {
    let currentEl;
    for (var i=index 1; i < arr.length; i  ) {
    currentEl = arr[i];
    if (element.sec == currentEl.sec amp;amp; element.row == currentEl.row amp;amp; Math.abs(currentEl.startSeat - element.endSeat) == 1) {
      if (!x.includes(element))
        x.push(element);
      if (!x.includes(currentEl))
        x.push(currentEl);
    }
  }
})

console.log(x);
 

Этот код повторяет y массив и для каждого текущего элемента ( currentEl переменной) сравнивает его с каждым следующим элементом и проверяет, соответствует ли он критериям «последовательных мест». Например, на первой forEach итерации текущий элемент имеет индекс 0, поэтому он сравнивается с элементами с индексами 1, 2, 3 и 4. Если он соответствует критериям, элементы помещаются в новый массив, только если их там еще нет. Следующий текущий элемент (с индексом 1) сравнивается с элементами с индексами 2, 3 и 4. И так далее, пока не будет обработан весь массив.