Фильтр Array на основе свойства в массиве его объектов - PullRequest
1 голос
/ 04 ноября 2019

Имеется следующая структура данных

const list = [
  {
    title: 'Section One',
    data: [
      {
        title: 'Ay',
      },
      {
        title: 'Bx',
      },
      {
        title: 'By',
      },
      {
        title: 'Cx',
      },
    ],
  },
  {
    title: 'Section Two',
    data: [
      {
        title: 'Ay',
      },
      {
        title: 'Bx',
      },
      {
        title: 'By',
      },
      {
        title: 'Cx',
      },
    ],
  },
];

Что я хочу сделать, это отфильтровать этот список на основе свойства заголовка в массиве данных каждого объекта. В качестве примера можно привести список, в котором свойство title дочерних элементов начинается с «B», поэтому список будет выглядеть так:

const filteredList = [
  {
    title: 'Section One',
    data: [
      {
        title: 'Bx',
      },
      {
        title: 'By',
      }
    ],
  },
  {
    title: 'Section Two',
    data: [
      {
        title: 'Bx',
      },
      {
        title: 'By',
      }
    ],
  },
];

То, что я до сих пор пробовал, было примерно таким:

 const items = list.filter(item =>
      item.data.find(x => x.title.startsWith('A')),
    );

или

const filtered = list.filter(childList => {
  childList.data.filter(item => {
    if (item.title.startsWith('B')) {
      return item;
    }
    return childList;
  });
});

Но я думаю, что здесь не хватает основного момента, может быть, некоторые из вас могли бы дать мне совет или намек на то, что я делаю неправильно

С наилучшими пожеланиями

1 Ответ

1 голос
/ 04 ноября 2019

Ваша проблема в том, что вы делаете .filter() на list. Это сохранит или удалит ваши объекты в list. Однако в вашем случае вы хотите сохранить все объекты в list и вместо этого сопоставить их с новым объектом. Для этого вы можете использовать .map(). Таким образом, вы можете отобразить ваши объекты в массиве list на новые объекты, которые содержат отфильтрованные массивы data. Вот пример того, как вы можете это сделать:

const list=[{title:"Section One",data:[{title:"Ay"},{title:"Bx"},{title:"By"},{title:"Cx"}]},{title:"Section Two",data:[{title:"Ay"},{title:"Bx"},{title:"By"},{title:"Cx"}]}];

const filterByTitle = (search, arr) => 
  arr.map(
    ({data, ...rest}) => ({
        ...rest, 
        data: data.filter(({title}) => title.startsWith(search))
    })
  );
console.log(filterByTitle('B', list));
...