簡體   English   中英

過濾數組的多個Javascript

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

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