[英]how to filter nested array like this?
我有如下回應
let m = [
{
name: 'Summary',
subListExpanded: false,
subList: [
]
},
{
name: 'Upload',
subListExpanded: false,
subList: [
]
},
{
name: 'Tasks',
subListExpanded: false,
subList: [
]
},
{
name: 'Dashboard',
subListExpanded: false,
subList: [
]
},
{
name: 'Master',
subListExpanded: false,
subList: [
{
id: 'user-master',
name: 'User-Master'
},
{
id: 'menu-master',
name: 'Menu-Master'
},
{
id: 'entity-master',
name: 'Entity-Master'
},
{
id: 'vendor-master',
name: 'Vendor-Master'
},
{
id: 'xxx-master',
name: 'xxx-Master'
}
]
}
];
如果我搜索m
過濾器應該是這樣的
[
{
name: 'Summary',
subListExpanded: false,
subList: [
]
},
{
name: 'Master',
subListExpanded: false,
subList: [
{
id: 'user-master',
name: 'User-Master'
},
{
id: 'menu-master',
name: 'Menu-Master'
},
{
id: 'entity-master',
name: 'Entity-Master'
},
{
id: 'vendor-master',
name: 'Vendor-Master'
},
{
id: 'xxx-master',
name: 'xxx-Master'
}
]
}
];
如果我搜索master
,過濾器響應應該是這樣的?
[
{
name: 'Master',
subListExpanded: false,
subList: [
{
id: 'user-master',
name: 'User-Master'
},
{
id: 'menu-master',
name: 'Menu-Master'
},
{
id: 'entity-master',
name: 'Entity-Master'
},
{
id: 'vendor-master',
name: 'Vendor-Master'
},
{
id: 'xxx-master',
name: 'xxx-Master'
}
]
}
];
如果我搜索xxx-master
則過濾器響應應為
[
{
name: 'Master',
subListExpanded: false,
subList: [
{
id: 'xxx-master',
name: 'xxx-Master'
}
]
}
];
如果我搜索slkvcsmcskc
過濾器響應如
[]
我的打字稿代碼無法正常工作。請幫助我解決此問題>
m.filter(x=> x.name.toLowerCase() === search.toLowerCase() || x.subList.some(x1=> x1.name.toLowerCase()===search.toLowerCase()))
以下代碼給出了所需的輸出。 請注意,我添加了一些復雜性,您的用例可能不需要。 但是,該示例應適用於具有任意深度嵌套的列表(請參見“ bar”示例)。
let m = [ { name: 'Summary', subListExpanded: false, subList: [ ] }, { name: 'Upload', subListExpanded: false, subList: [ { name: 'foo', subList: [ { name: 'bar', } ], } ] }, { name: 'Tasks', subListExpanded: false, subList: [ ] }, { name: 'Dashboard', subListExpanded: false, subList: [ ] }, { name: 'Master', subListExpanded: false, subList: [ { id: 'user-master', name: 'User-Master' }, { id: 'menu-master', name: 'Menu-Master' }, { id: 'entity-master', name: 'Entity-Master' }, { id: 'vendor-master', name: 'Vendor-Master' }, { id: 'xxx-master', name: 'xxx-Master' } ] } ]; function search (input, query) { const queryReg = new RegExp(query, 'i'); function searchInternal (data) { let result = []; data.forEach(item => { const parentMatch = queryReg.test(item.name); let subMatch = false; if (item.subList) { let subResult = searchInternal(item.subList); subMatch = subResult.length > 0; item.subList = subMatch ? subResult : []; } // push parent if it matches for itself or a child (list) matches if (parentMatch || subMatch) result.push(item); }); return result; } return searchInternal(JSON.parse(JSON.stringify(input)) /* create a working copy with JSON.parse(...) */); } console.log('master', search(m, 'master')); console.log('xxx-master', search(m, 'xxx-master')); console.log('m', search(m, 'm')); console.log('bar', search(m, 'bar')); console.log('slkvcsmcskc', search(m, 'slkvcsmcskc'));
實際上,它應該像這樣:
obj = {
_id: "sjkd9skj",
data: {
dektop: [
{
x: 2,
y: 3,
t: { key: 'aabbcc'}
},
...
],
mobile: [
{
x: 4,
y: 3,
t: { key: 'ffff'}
},
...
],
print: [
{
x: 7,
y: 5,
t: { key: 'ppp'}
},
...
]
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.