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