簡體   English   中英

如何根據 Javascript 中的另一個 object 過濾對象數組

[英]How to filter array of objects based on another object in Javascript

誰能幫我知道如何根據另一個 object 條件過濾一組對象。

樣本數組

const arrayToFilter=  [   {
        name: 'Arlin Schistl',
        screen_name: 'aschistl1c',
        followers_count: 101,
        following_count: 657,
        location: 'Indonesia',
        verified: true,  
        },  
        {
        name: 'Henka Perren',
        screen_name: 'hperren1d',
        followers_count: 170,
        following_count: 422,
        location: 'Mexico',
        verified: true,   }, ]

過濾器 Object:

const conditions=[ 
    { 
        id: 'name', 
        operator: 'CONTAINS' 
        value: 'Bob', 
    },
    { 
        condition:'OR',
        id: 'followers_count', 
        operator: 'GTE' 
        value: 200, 
    }, 
    {
        condition:'AND',
        id: 'following_count', 
        operator: 'LTE' 
        value: 10,
    },
    {
        condition:'AND',
        id: 'followers_count', 
        operator: 'GTE' 
        value: 150,
    } 
  ]

如果它與按位運算符的執行順序中的條件匹配,則該數組應返回 object。 請讓我知道為此優化的代碼是什么。 提前致謝!

您可以使用conditions上的every調用來過濾每個項目。 只需switch operator並使用item[id]value進行比較。

我將第二項更改為以下內容,以便它遵守約束:

{
  name: 'Bob Perren',
  screen_name: 'hperren1d',
  followers_count: 300,
  following_count: 5,
  location: 'Mexico',
  verified: true,
}

 const filterWithConditions = (arr, conditions) => arr.filter(item => conditions.every(({ id, operator, value }) => { switch (operator) { case 'CONTAINS': return item[id].indexOf(value) > -1; case 'GTE': return item[id] >= value; case 'LTE': return item[id] <= value; default: return false; } })); const arrayToFilter = [{ name: 'Arlin Schistl', screen_name: 'aschistl1c', followers_count: 101, following_count: 657, location: 'Indonesia', verified: true, }, { name: 'Bob Perren', screen_name: 'hperren1d', followers_count: 300, following_count: 5, location: 'Mexico', verified: true, }] const conditions = [ { id: 'name', operator: 'CONTAINS', value: 'Bob' }, { id: 'followers_count', operator: 'GTE', value: 200 }, { id: 'following_count', operator: 'LTE', value: 10 } ]; const filtered = filterWithConditions(arrayToFilter, conditions); console.log(filtered);
 .as-console-wrapper { top: 0; max-height: 100%;important; }

或者,您可以使用 object(地圖)查找而不是switch

const operators = {
  CONTAINS : (a, b) => a.indexOf(b) > -1,
  GTE      : (a, b) => a >= b,
  LTE      : (a, b) => a <= b
}

const filterWithConditions = (arr, conditions) =>
  arr.filter(item => conditions.every(({ id, operator, value }) =>
    operators[operator](item[id], value)));

您必須從字符串到運算符創建一個 map,然后遍歷您的數組:

const operators = {
   "CONTAINS" : (...) => {...}
   "GTE" : (...) => {...}
   "LTE" : (...) => {...}
}
let res = arrayToFilter.filter( el => {
   return conditions.every( cond => operators(el[id]))
})

暫無
暫無

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

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