[英]Filter an array which is a property of an object in an immutable way
如何以不可變的方式過濾作為對象屬性的數組? 對於前者
public transform(contactGroups: ContactGroup[], searchText: string): ContactGroup[] {
if (!contactGroups) {
return [];
}
if (searchText === undefined) {
return contactGroups;
}
return contactGroups.filter((contactGroup: ContactGroup) => {
return contactGroup.contacts.filter((contact: Contact) => {
return contact.displayName && contact.displayName.toLowerCase().includes(searchText.toLowerCase())
}).length > 0;
});
}
在上面的示例中,contactGroup.contacts包含數組中的所有項,但不包含篩選結果到期對象引用。
任何幫助,將不勝感激。 謝謝。
function transform(contactGroups, searchText) { if (!contactGroups) { return []; } if (searchText === undefined) { return contactGroups; } return contactGroups.filter(function (contactGroup) { return contactGroup.contacts.filter(function (contact) { return (contact.displayName && contact.displayName.toLowerCase().includes(searchText.toLowerCase())); }).length > 0; }); }; var contactGroups = [{ "letter":"S", "contacts":[ { "id":"173", "rawId":null, "displayName":"sam", "name":{ "givenName":"sam", "formatted":"sam" }, "nickname":null, "phoneNumbers":null, "emails":[ { "id":"955", "pref":false, "value":"sam@xyz.com", "type":"other" } ], "addresses":null, "ims":null, "organizations":null, "birthday":null, "note":"", "photos":null, "categories":null, "urls":null }, { "id":"1717", "rawId":null, "displayName":"Sat33", "name":{ "givenName":"Sat33", "formatted":"Sat33 " }, "nickname":null, "phoneNumbers":[ { "id":"5521", "pref":false, "value":"1133", "type":"work" } ], "emails":null, "addresses":null, "ims":null, "organizations":null, "birthday":null, "note":null, "photos":null, "categories":null, "urls":null }, { "id":"1712", "rawId":null, "displayName":"Server1234", "name":{ "givenName":"Server1234", "formatted":"Server1234 " }, "nickname":null, "phoneNumbers":[ { "id":"5509", "pref":false, "value":"1234", "type":"mobile" } ], "emails":null, "addresses":null, "ims":null, "organizations":null, "birthday":null, "note":null, "photos":null, "categories":null, "urls":null } ] }] console.log(transform(contactGroups, 'ver'))
它應該返回contactGroup只有聯系對象'Server1234',因為搜索的字符串是'ver'但它仍然返回contactGroup與所有聯系對象。
你可以嘗試這個解決方案
class ContactGroup {
contacts: Contact[]
}
class Contact {
displayName: string
}
function transform(contactGroups: ContactGroup[], searchText: string): ContactGroup[] {
if (!contactGroups) {
return [];
}
if (searchText === undefined) {
return contactGroups;
}
return contactGroups.map((contactGroup: ContactGroup) => {
return {
...contactGroup,
contacts: contactGroup.contacts.filter((contact: Contact) => {
return contact.displayName && contact.displayName.toLowerCase().includes(searchText.toLowerCase())
})
}
}).filter((contactGroup: ContactGroup) => {
return contactGroup.contacts.length > 0
})
}
您可以清空傳遞的數組並將過濾后的元素推入其中。 以下是代碼的簡化版本:
function transform(contactGroups, searchText) { var filtered = contactGroups.filter(e => e.name.includes(searchText)); contactGroups.splice(0, contactGroups.length); contactGroups.push(...filtered); return filtered; // <-- if still needed } var contacts = [{name: 'abc'}, {name: 'abcc'}, {name: 'xyz'}]; transform(contacts, 'abc'); console.log(contacts);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.