我有一個具有兩個欄位的物件,filter1并且filter2具有陣列形式的值
let filter = {filter1:["mine","your"]: filter2:["C","D"]} //數值不固定
資料是物件陣列的形式
let data = [
{ id:1, filter1:["mine"], filter2:["E","C"]},
{ id:2, filter1:["mine"], filter2:["E","C","F"]},
{ id:3, filter1:["your"], filter2:["C"]},
{ id:3, filter1:["your"], filter2:["D","C"]},
{ id:5, filter1:["other"], filter2:["F"]},
...
]
我必須過濾掉那些具有存在于用于特定的密鑰的欄位中的任何一個物件例如,如果filter是{filter1:["mine"]: filter2:["F","D"]}將首先搜索過濾器1的任何元件在資料物件的過濾器1和搜索的過濾器2的任何元件后,其存在于所述資料物件的 filter2 并在找到任何一個時回傳該物件
few example
結果為 {filter1:["mine"]: filter2:["F","D"]}
result = [
{ id:1, filter1:["mine"], filter2:["E","C"]}, //since filter1 "mine"
{ id:2, filter1:["mine"], filter2:["E","C","F"]}, //since filter1 "mine"
{ id:3, filter1:["your"], filter2:["D","C"]}, //since from "F" and "D" from filter2 "D" is present
{ id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present
]
結果為 {filter1:["your"]: filter2:["F","G"]}
result = [
{ id:2, filter1:["mine"], filter2:["E","C","F"]}, //since "F" from filter2 is present
{ id:3, filter1:["your"], filter2:["D","C"]}, //since filter1 is "your"
{ id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present
]
結果為 {filter1:[]: filter2:["D"]}
result = [
{ id:3, filter1:["your"], filter2:["D","C"]}, //since filter2 has "D"
]
uj5u.com熱心網友回復:
可以概括通過RoMilton提出的解決方案通過呼叫some()上Object.entries()傳遞的過濾器的物件,然后每個迭代key和filter_array嵌套some()呼叫。
如果您還將Array#concat()當前迭代的資料元素屬性放入陣列中,則可以在過濾器物件中包含非陣列屬性,即id在這種情況下。
const data = [
{ id: 1, filter1: ["mine"], filter2: ["E", "C"] },
{ id: 2, filter1: ["mine"], filter2: ["E", "C", "F"] },
{ id: 3, filter1: ["your"], filter2: ["C"] },
{ id: 3, filter1: ["your"], filter2: ["D", "C"] },
{ id: 5, filter1: ["other"], filter2: ["F"] }
];
const search = (array, filter_object) =>
array.filter(item =>
Object.entries(filter_object).some(([key, filter_array]) =>
[].concat(item[key]).some(fitem => filter_array.includes(fitem)))
);
const filter = { filter1: ["mine"], filter2: ["F", "D"] };
const result = search(data, filter);
console.log(...result.map(({ id }) => ({ id })));
const filter2 = { id: [5], filter1: ["mine"] }
const result2 = search(data, filter2);
console.log(...result2.map(({ id }) => ({ id })));
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
您可以使用.filter(),.some()和的組合.includes():
const data = [
{ id:1, filter1:["mine"], filter2:["E","C"]},
{ id:2, filter1:["mine"], filter2:["E","C","F"]},
{ id:3, filter1:["your"], filter2:["C"]},
{ id:3, filter1:["your"], filter2:["D","C"]},
{ id:5, filter1:["other"], filter2:["F"]}
];
const search = ({ filter1, filter2 }) =>
data.filter(item =>
item.filter1.some(fItem => filter1.includes(fItem)) ||
item.filter2.some(fItem => filter2.includes(fItem))
);
const result = search({ filter1:["mine"], filter2:["F","D"] });
console.log(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/335749.html
標籤:javascript 数组 目的 阵列过滤器 数组数组
