[英]Filter Multiple of an array Javascript
我有一個數組,我想按國家/地區和服務過濾這個數組。
這是數組:
const myData = [
{country : "USA" , Service : "PHONE" },
{country : "FRANCE" , Service : "DATA"},
{country : "FRANCE" ,Service : "CAFE"},
{country : "FRANCE" ,Service : "CAFE"},
{country : "CHINA" ,Service : "CAFE"}
{country : "ITALY" ,Service : "CAFE"}
]
我想按國家/地區或多個國家/地區以及服務或多個服務過濾此數組
我試過這個代碼,但告訴我它只有一個國家
let filt = myData.filter((v) => {
return v.country === "CHINA"
})
console.log(filt);
對於前任,我只想返回意大利和法國,那里有 Service CAFE
您可以將您的條件更改為:
(v.country === "CHINA" || v.country === "ITALY") && v.Service === "CAFE"
.filter()
方法將保留回調函數為其返回true
所有對象。 當國家是"CHINA"
或 ( ||
) "ITALY"
並且 ( &&
) Service
等於"CAFE"
時,上述條件將返回真。
請參閱下面的示例:
const myData = [ {country : "USA" , Service : "PHONE" }, {country : "FRANCE" , Service : "DATA"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "CHINA" ,Service : "CAFE"}, {country : "ITALY" ,Service : "CAFE"} ]; let filt = myData.filter((v) => { return (v.country === "CHINA" || v.country === "ITALY") && v.Service === "CAFE"; }); console.log(filt);
請注意, (v.country === "CHINA" || v.country === "ITALY")
周圍的括號是必需的。 因為&&
運算符優先級高於||
,表達式將改為像這樣計算:
v.country === "CHINA" || (v.country === "ITALY" && v.Service === "CAFE")
這會給你不正確的值(因為當國家是“CHINA”時它會返回 true,忽略Service
的值)
如果需要,您還可以通過將要保留的國家/地區和服務放入Set
,然后檢查 Set .has()
中的v.country
和v.Service
的值, v.country
v.Service
:
const myData = [ {country : "USA" , Service : "PHONE" }, {country : "FRANCE" , Service : "DATA"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "CHINA" ,Service : "CAFE"}, {country : "ITALY" ,Service : "CAFE"} ]; const keepCountries = new Set(["CHINA", "ITALY"]); const keepServices = new Set(["CAFE"]); let filt = myData.filter((v) => { return keepCountries.has(v.country) && keepServices.has(v.Service); }); console.log(filt);
注意:如果你的keepCountries
數組和keepServices
數組很大,這里Set
的用法是為了加快速度。 對於這個演示案例,它們很小,因此集合可以是標准數組,這將要求您在檢查數組中是否包含值時使用.includes()
而不是.has()
。
您可以將過濾器的條件設置為您想要的任何條件。
像這樣的東西。
const myData = [ {country : "USA" , Service : "PHONE" }, {country : "FRANCE" , Service : "DATA"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "CHINA" ,Service : "CAFE"}, {country : "ITALY" ,Service : "CAFE"} ]; let filt = myData.filter((v) => { return (v.country === "ITALY" || v.country === "FRANCE") && v.Service === "CAFE"; }) console.log(filt);
請參閱尼克帕森的回答。 清楚多了。
您可以使用Array.prototype.includes()
方法一次匹配多個條件。 循環遍歷每個對象時,您可以檢查國家和服務是否與您傳遞的數組中的任何項目匹配。
這允許您創建一個靈活的函數,可以根據您的查詢檢查多個組合。
const myData = [ {country : "USA" , Service : "PHONE" }, {country : "USA" , Service : "CAFE" }, {country : "FRANCE" , Service : "DATA"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "FRANCE" ,Service : "CAFE"}, {country : "CHINA" ,Service : "CAFE"}, {country : "CHINA" ,Service : "PHONE"}, {country : "ITALY" ,Service : "DATA"}, {country : "ITALY" ,Service : "PHONE"} ]; const filterData = (countries, services, data) => data.filter(({ country, Service }) => (countries.includes(country) && services.includes(Service))); const resultFranceChinaCafes = filterData(['FRANCE', 'CHINA'], ['CAFE'], myData); const resultUSAItalyPhones = filterData(['USA', 'ITALY'], ['PHONE'], myData); const resultFranceItalyData = filterData(['FRANCE', 'ITALY'], ['DATA'], myData); console.log(resultFranceChinaCafes); console.log(resultUSAItalyPhones); console.log(resultFranceItalyData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.