简体   繁体   English

Javascript过滤嵌套数组

[英]Javascript filtering nested arrays

I'm trying to filter a on a nested array inside an array of objects in an Angular app. 我正在尝试在Angular应用程序中的对象数组内的嵌套数组上过滤a。 Here's a snippet of the component code - 这是组件代码的片段-

var teams = [
  { name: 'Team1', members: [{ name: 'm1' }, { name: 'm2' }, { name: 'm3' }] }, 
  { name: 'Team2', members: [{ name: 'm4' }, { name: 'm5' }, { name: 'm6' }] }, 
  { name: 'Team3', members: [{ name: 'm7' }, { name: 'm8' }, { name: 'm9' }] }
];

What I'm trying to achieve is if I search for m5 for example my result should be - 我要达到的目标是,例如,我搜索m5 ,结果应该是-

var teams = [
  { name: 'Team1', members: [] }, 
  { name: 'Team2', members: [{ name: 'm5' }] }, 
  { name: 'Team3', members: [] }
];

So I've got teams and filteredTeams properties and in my search function I'm doing - 因此,我有teamsfilteredTeams属性,并且在搜索功能中,我正在执行-

onSearchChange(event: any): void {
  let value = event.target.value;
  this.filteredTeams = this.teams.map(t => {
    t.members = t.members.filter(d => d.name.toLowerCase().includes(value));
    return t;
  })
}

Now this does work to some extent however because I'm replacing the members it's destroying the array on each call (if that makes sense). 现在,这确实在某种程度上起作用了,因为我要替换成员,这会破坏每次调用时的数组(如果这样的话)。 I understand why this is happening but my question is what would be the best way to achieve this filter? 我了解为什么会发生这种情况,但我的问题是实现此过滤器的最佳方法是什么?

you were very close, the only thing that you did wrong was mutating the source objects in teams 您非常亲密,您做错的唯一一件事就是对teams的源对象进行突变

basically you can use spread operator to generate a new entry and then return a whole new array with new values. 基本上,您可以使用传播运算符生成一个新的条目,然后返回带有新值的全新数组。

 const teams = [ { name: 'Team1', members: [{ name: 'm1' }, { name: 'm2' }, { name: 'm3' }] }, { name: 'Team2', members: [{ name: 'm4' }, { name: 'm5' }, { name: 'm6' }] }, { name: 'Team3', members: [{ name: 'm7' }, { name: 'm8' }, { name: 'm9' }] } ]; const value = 'm5'; const result = this.teams.map(t => { const members = t.members.filter(d => d.name.toLowerCase().includes(value)); return { ...t, members }; }) console.log(result) 

Check this. 检查一下。 Instead of hard coded m5 pass your value. 而不是硬编码的m5传递您的价值。

 const teams = [ { name: 'Team1', members: [{ name: 'm1' }, { name: 'm2' }, { name: 'm3' }] }, { name: 'Team2', members: [{ name: 'm4' }, { name: 'm5' }, { name: 'm6' }] }, { name: 'Team3', members: [{ name: 'm7' }, { name: 'm8' }, { name: 'm9' }] } ]; const filteredTeams = teams.map(team => ({ name: team.name, members: team.members.filter(member => member.name.includes('m5')) })); console.log(filteredTeams); 

You are mutating the original objects, but you could assing new properties to the result object for mapping instead. 您正在突变原始对象,但是可以将新属性赋给结果对象以进行映射。

 var teams = [{ name: 'Team1', members: [{ name: 'm1' }, { name: 'm2' }, { name: 'm3' }] }, { name: 'Team2', members: [{ name: 'm4' }, { name: 'm5' }, { name: 'm6' }] }, { name: 'Team3', members: [{ name: 'm7' }, { name: 'm8' }, { name: 'm9' }] }], result = teams.map(o => Object.assign( {}, o, { members: o.members.filter(({ name }) => name === 'm5') } )); console.log(result); console.log(teams); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Try to seperate your filter function first: 尝试先分离您的过滤器功能:

const filterTeamMembers = (teams, filterArr) => {
    const useFilter = filterArr.map(x => x.toLowerCase());

    return teams.map(team => ({
        ...team,
        members: team.members.filter(member => useFilter.includes(member.name))
    }))
};
// =========== And then:

onSearchChange(event: any): void {
    let value = event.target.value;
    this.filteredTeams = filterTeamMembers(this.teams, [value]);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM