Как отфильтровать объект с вложенными массивами по второму вложенному массиву? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть объект со структурой, подобной приведенной ниже.

Object{
    Array [{
        property1: "",
        property2: "",
        innerArray: [{
            arrayProperty1
            arrayProperty2
          }]
    }]
}

Как лучше всего фильтровать по innerArray.Property2?У меня есть список фильтров, которые мне нужно применить.Приведенный ниже код показывает, как я сейчас пытаюсь применить фильтры, однако список вообще не изменяется.

    if(filterList)
    {
      // if this length is 0, don't include inventory in the filter
      let filterOnInventoryId = filterList.filter((item: any) => {
        return (item && item.Type === 'InventoryId');
      });


      let shouldFilterInventoryId = filterOnInventoryId && filterOnInventoryId.length > 0;
      let shouldFilterAppointmentType = filterOnAppointmentType && filterOnAppointmentType.length > 0;

      // find any inventoryIds that are part of the filter, else return an empty list
      let filteredListInventoryId = shouldFilterInventoryId ? filterOnInventoryId.filter((item: any) => 
      {
        var x = this.selectedDateAndAppointmentList.filter((dateModelAndAppointment: any) => 
        {
          return dateModelAndAppointment.appointmentList.filter((appointment: any) =>{
            item.InventoryTypeId == appointment.Inventory.InventoryTypeId;
          })
        })
        return x;
      }) : [];

    }

1 Ответ

0 голосов
/ 21 декабря 2018

Фильтрация вложенных массивов, например:

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")
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...