Фильтрация вложенных массивов, например:
selectedDateAndAppointmentList.filter(dateModelAndAppointment =>
dateModelAndAppointment.appointmentList.filter(...)
);
не будет выполнять фильтрацию верхнего массива, потому что Array.prototype.filter
всегда возвращает массив, и ваш код, таким образом, фильтрует на истинность []
, который всегда правдив, и ничего не фильтруется.
selectedDateAndAppointmentList.filter(dateModelAndAppointment =>
dateModelAndAppointment.appointmentList.filter(...)
// ^ will always return true because appointmentList.filter always returns an array
);
Вот что происходит:
// no filtering is happening because inner
// filter always returns a truthy value
console.log(
[{ values: ["a", "b"] }, { values: ["c", "d"] }].filter(item =>
item.values.filter(val => val === "a")
)
);
Вместо этого вы должны использовать Array.prototype.some
или Array.prototype.every
, которые возвращают логическое значение, а не массив и, следовательно, могут использоваться в качестве условия фильтрации:
selectedDateAndAppointmentList.filter(dateModelAndAppointment =>
dateModelAndAppointment.appointmentList.some(...)
// ^ this will return a boolean based on a nested array condition
)
Например:
// filtering now works because the inner filter
// correctly returns a boolean value depending
// on the filter condition
console.log(
[{ values: ["a", "b"] }, { values: ["c", "d"] }].filter(item =>
item.values.some(val => val === "a")
)
);