#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. И так далее, пока не будет обработан весь массив.