[英]Javascript: From JSON array of strings in the form of key:value to array of objects
[英]Fetching Objects from Array by passing key & value in javascript
這是我的對象數組。 我想通過在函數中傳遞查詢來過濾對象。
const products = [{
name: "A",
color: "Blue",
size: 50
},
{
name: "B",
color: "Blue",
size: 60
},
{
name: "C",
color: "Black",
size: 70
},
{
name: "D",
color: "Green",
size: 50
}
];
我想要的輸出將從我在函數中傳遞的查詢中過濾,該函數可以是任何東西
{
name: "A",
color: "Blue",
size: 50
}, {
name: "C",
color: "Black",
size: 70
}
這是我將傳遞給函數的查詢對象
const filter = {
color: ["Blue", "Black"],
size: [70, 50]
};
這是我的函數,我可以將其分配給其他變量並將其用於進一步的操作
const filteredData = filterIt(products, filter);
您可以獲取過濾器對象的條目並獲取用於檢查includes
鍵和值。
const filterBy = filter => o => Object.entries(filter).every(([k, v]) => v.includes(o[k])), filterIt = (array, filter) => array.filter(filterBy(filter)), products = [{ name: "A", color: "Blue", size: 50 }, { name: "B", color: "Blue", size: 60 }, { name: "C", color: "Black", size: 70 }, { name: "D", color: "Green", size: 50 }], filter = { color: ["Blue", "Black"], size: [70, 50] }, filteredData = filterIt(products, filter); console.log(filteredData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
這是另一種選擇:
function filterIt(products, filter) {
return products.filter(p => {
for (const k in filter) {
if (filter[k].indexOf(p[k]) === -1) {
return false;
}
}
return true;
})
}
觀看演示
如果您想在邏輯中使用 OR 而不是 AND ,則先前修改的函數將是:
function filterIt(products, filter) {
return products.filter(p => {
for (const k in filter) {
// if a value of any property of the product is contained in a filter array, include it
if (filter[k].indexOf(p[k]) !== -1) {
return true;
}
}
return false;
})
}
也可以看看這個Demo :)
const products = [{ name: "A", color: "Blue", size: 50 }, { name: "B", color: "Blue", size: 60 }, { name: "C", color: "Black", size: 70 }, { name: "D", color: "Green", size: 50 } ]; const filter = { color: ["Blue", "Black"], size: [70, 50] }; let filterIt = (products, filter) => { return products.filter(p => { //get all filter keys let keys = Object.keys(filter); let validkeys = []; keys.forEach(k=>{ // check if filter property exist and includes filter value if(p.hasOwnProperty(k) && filter[k].includes(p[k])){ validkeys.push(true); } }) //check all filter matches return validkeys.length === keys.length; }); } const filteredData = filterIt(products, filter); console.log("...filteredData", filteredData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.