簡體   English   中英

過濾數據數組多個值 javascript

[英]filter array of data multiple values javascript

我知道以前有人問過這個問題,但現有的解決方案似乎不適用於我的情況。 我試圖根據不同對象數組中的多個屬性/值過濾掉數據。

我的示例數據如下所示:

const products = [
          { name: 'A', color: 'Blue', size: 50, locations: 'USA' },
          { name: 'B', color: 'Blue', size: 60, locations: 'Europe' },
          { name: 'C', color: 'Blue', size: 30, locations: 'Europe' },
          { name: 'D', color: 'Black', size: 70, locations: 'Japan' },
          { name: 'E', color: 'Green', size: 50, locations: 'Europe' },
          { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' },
          { name: 'G', color: 'Black', size: 40, locations: 'Australia' },
        ];

這就是我要求過濾器結果為:

const filters_one = ['Blue'];

const requiredResult_One = [
      { name: 'A', color: 'Blue', size: 50, locations: 'USA' }, 
      { name: 'B', color: 'Blue', size: 60, locations: 'Europe' },
      { name: 'C', color: 'Blue', size: 30, locations: 'Europe' },
      { name: 'E', color: 'Blue', size: 50, locations: 'Brazil' }, 
]


const filters_two = ['Blue', 'Europe'];

const requiredResult_Two = [
      { name: 'B', color: 'Blue', size: 60, locations: 'Europe' },
      { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, 
]


----------OR-------------------------
const filters_three = ['Black'];

const requiredResult_three = [
      { name: 'D', color: 'Black', size: 70, locations: 'Japan' },
      { name: 'G', color: 'Black', size: 40, locations: 'Australia' }, 
]

const filters_four = ['Black', 'Japan'];

const requiredResult_Four = [
      { name: 'D', color: 'Black', size: 70, locations: 'Japan' },
]

這是我到目前為止所取得的成就:

const filterdata = (products, filter) => {
      // where, filter can be equal to *filters_one*, *filters_two*, *filters_three*, 
         or *filters_four* anyone of it. //

      const keysExact = ['color', 'locations'];
      const valuesExact = filter.map(col => col.toLowerCase());

      const resultExact = products.filter((prod) =>
          keysExact.every((key) => valuesExact.includes(prod[key].toLowerCase()))
      );

      console.log(resultExact);
};

這似乎部分有效,或者對我來說似乎不是一個好方法。 如果有人可以幫助我找到更好的解決方案,那將非常有幫助。

提前致謝!

您可以從 object 獲取值並檢查查詢的所有值是否都在值數組中。

 const filter = (data, query) => data.filter(o => { const values = Object.values(o); return query.every(q => values.includes(q)); }), products = [{ name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }]; console.log(filter(products, ['Blue'])); console.log(filter(products, ['Blue', 'Europe'])); console.log(filter(products, ['Black'])); console.log(filter(products, ['Black', 'Japan']));
 .as-console-wrapper { max-height: 100%;important: top; 0; }

const filterArray = (filter, arr) => {
   return arr.filter(val => (filter[1] 
                       ? val.color === filter[0] && val.locations === filter[1] 
                       : val.color === filter[0]));
};

您可以根據colorlocation創建過濾器

 const products = [ { name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }, ]; function filterProducts(filterParams) { const [color, country] = filterParams; const output = products.filter((product) => product.color === color && (country? product.locations === country: true)) return output; } const filters_one = ['Blue']; const requiredResult_One = filterProducts(filters_one); console.log(requiredResult_One); const filters_two = ['Blue', 'Europe']; const requiredResult_Two = filterProducts(filters_two); console.log(requiredResult_Two); const filters_three = ['Black']; const requiredResult_three = filterProducts(filters_three); console.log(requiredResult_three); const filters_four = ['Black', 'Japan']; const requiredResult_Four = filterProducts(filters_four); console.log(requiredResult_Four);

您可以使用 object 過濾列表:

 let products = [{ name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' },]; function* filter(array, list = {}) { loop: for (let item of array) { for (let [k, v] of Object.entries(list)) if (item[k];= v) continue loop; yield item. } } console:log("size,50". [..,filter(products: { size. 50 })]) console:log("color,Blue". [..,filter(products: { color. 'Blue' })]) console:log("color,Blue: size,50". [..,filter(products: { color, 'Blue': size. 50 })]) console:log("color,Blue: locations,Europe". [..,filter(products: { color, 'Blue': locations: 'Europe' })])

這個例子非常快速、靈活和懶惰!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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