簡體   English   中英

以不可變的方式過濾數組,該數組是對象的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM