簡體   English   中英

根據另一個對象數組中的過濾條件過濾對象數組:JavaScript

[英]Filter an array of objects based on filter criteria in another array of objects: JavaScript

我希望根據myFilter提到的標准過濾myArray myFilter的鍵是定義的,可以使用myFilter.fieldmyFilter.value訪問,其中key: myArray值是未知的。 我們可能必須迭代myArray每個對象,首先將myArray [key]與myFilter.field匹配,然后將myArray [key]與myFilter.field匹配。

這應該是一個AND邏輯

 myArray = [{ make: "Honda", model: "CRV", year: "2017" }, { make: "Toyota", model: "Camry", year: "2020" }, { make: "Chevy", model: "Camaro", year: "2020" } ] myFilter = [{ field: "make", value: "Chevy", type: "string" }, { field: "year", value: "2020", type: "date" } ]; // Expected OutPut: myArray = [{ make: "Chevy", model: "Camaro", year: "2020" }] var tempArray = []; const keysToMatch = myFilter.length; let matchedItems = []; myArray.forEach((data) => { matchedItems = []; let itemsToFind = Object.values(data); myFilter.forEach((filterItem) => { if (itemsToFind.indexOf(filterItem.value) != -1) { matchedItems.push("matched"); } }); //check if everything matched if (matchedItems.length === keysToMatch) { tempArray.push(data); } }); console.log(tempArray); 

您可以使用普通for循環和數組過濾器。 定義變量filteredArray並使用for循環來迭代myFilter 在每次迭代期間,創建一個變量k其值將設置為已過濾的數組。 因此,在第一步, k的初始值將是myArrayk將被過濾,過濾后的值將被設置為filteredArray 在第二次迭代期間,等等, k的值將被設置為第一個過濾的數組

 let myArray = [{ make: "Honda", model: "CRV", year: "2017" }, { make: "Toyota", model: "Camry", year: "2020" }, { make: "Chevy", model: "Camaro", year: "2020" } ] let myFilter = [{ field: "make", value: "Chevy", type: "string" }, { field: "year", value: "2020", type: "date" } ]; let filteredArray; for (let i = 0; i < myFilter.length; i++) { let k = filteredArray !== undefined ? filteredArray : myArray if (myFilter[i].field === 'make') { filteredArray = k.filter(item => item[myFilter[i].field] === myFilter[i].value) } else if (myFilter[i].field === 'year') { filteredArray = k.filter(item => item[myFilter[i].field] === myFilter[i].value) } } console.log(filteredArray) 

var tempArray = [];
const keysToMatch = myFilter.length;
let matchedItems = [];
myArray.forEach((data) => {
    matchedItems = [];
    let itemsToFind = Object.values(data);
    myFilter.forEach((filterItem) => {
        if (itemsToFind.indexOf(filterItem.value) != -1) {
            matchedItems.push("matched");
        }
    });
    //check if everything matched
    if (matchedItems.length === keysToMatch) {
        tempArray.push(data);
    }
});

console.log(tempArray);

理論上這應該可行,但由於某種原因不會(返回一個空數組)。 我希望其他一些讀者的頭腦能讓它發揮作用! 隨意編輯。

 myArray = [{ make: "Honda", model: "CRV", year: "2017" }, { make: "Toyota", model: "Camry", year: "2020" }, { make: "Chevy", model: "Camaro", year: "2020" } ] myFilter = [{ field: "make", value: "Chevy", type: "string" }, { field: "year", value: "2020", type: "date" } ]; const myNewArray = myArray.filter((car) => myFilter.every((filter) => car[filter.field] === car[filter.value])); console.log(myNewArray); 

對於您的需求,這可能有點過於復雜,但它確實有效。

 myArray = [ { make: "Honda", model: "CRV", year: "2017" }, { make: "Toyota", model: "Camry", year: "2020"}, { make: "Chevy", model: "Camaro", year: "2020"} ] myFilter = [ { field: "make", value: "Chevy", type: "string" }, { field: "year", value: "2020", type: "date" } ]; //only return those that return true var newArray = myArray.filter(car => { var temp = true; //iterate over your filters for (var i = 0; i < myFilter.length; i++) { //if any filters result in false, then temp will be false if (car[myFilter[i].field] != myFilter[i].value) { temp = false; } } if (temp == true) { return true; } else { return false; } }); console.log(JSON.stringify(newArray)); 

暫無
暫無

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

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