[英]Filter Nested Object in JavaScript
此代碼片段僅使用字符串值過濾對象數組。
那么如何使代碼片段適合嵌套對象,以便它可以過濾對象數組以及其中的嵌套對象?
mainLogic = (_data, search) => {
//_data is an array of objects
let _allsearch = search.trim().toLowerCase();
if (_allsearch.length > 0) {
_data = Object.values(_data).filter((obj) => {
return Object.keys(obj).some((key) => {
// the code usually breaks at this point. when it encounters a nested object
return obj[key].toLowerCase().includes(_allsearch);
});
});
}
return _data;
};
這是一個示例對象:
let _data = [
{
id: "1",
firstname: "Precious",
lastname: "Same",
age: "29",
state: "Abia",
email: "sam@gmail.com",
country: "Michigan",
town:{
name:"Jos"
}
},
{
id: "2",
firstname: "Bolu",
lastname: "Joke",
age: "32",
state: "Ogun",
email: "bolu.joke@outlook.com",
country: "america",
town:{
name:"California"
}
}
]
調用函數時:
this.mainLogic(_data, "california")
這是我的期望:
[
{
id: "2",
firstname: "Bolu",
lastname: "Joke",
age: "32",
state: "Ogun",
email: "bolu.joke@outlook.com",
country: "america",
town:{
name:"Califonia"
}
}
]
免責聲明:代碼主要來源於這里
我只是將對象展平,這樣每個屬性都在同一級別上,您不需要滿足嵌套對象的需求。 之后,過濾的方式與您現在的方式相同。 (省略驗證和錯誤檢查,您可以調整您的代碼)
let data = [{ id: "1", firstname: "Precious", lastname: "Same", age: "29", state: "Abia", email: "sam@gmail.com", country: "Michigan", town: { name: "Jos" } }, { id: "2", firstname: "Bolu", lastname: "Joke", age: "32", state: "Ogun", email: "bolu.joke@outlook.com", country: "america", town: { name: "California" } } ]; function flattenObject(ob) { var toReturn = {}; for (var i in ob) { if (!ob.hasOwnProperty(i)) continue; if ((typeof ob[i]) == 'object') { var flatObject = flattenObject(ob[i]); for (var x in flatObject) { if (!flatObject.hasOwnProperty(x)) continue; toReturn[i + '.' + x] = flatObject[x]; } } else { toReturn[i] = ob[i]; } } return toReturn; }; function mainLogic(data, search) { for (let obj of data) { flattened = flattenObject(obj); if (Object.values(flattened).includes(search)) return obj; }; }; console.log(mainLogic(data, "California"))
有必要扁平化對象,然后可以輕松過濾數組:
_data.forEach((el, i) => {
let flattenedObject = flatObject(el);
if (Object.values(flattenedObject).includes(searchWord))
_data = _data.filter((f, ind) => ind == i);
})
一個例子:
let _data = [ { id: "1", firstname: "Precious", lastname: "Same", age: "29", state: "Abia", email: "sam@gmail.com", country: "Michigan", town:{ name:"Jos" } }, { id: "2", firstname: "Bolu", lastname: "Joke", age: "32", state: "Ogun", email: "bolu.joke@outlook.com", country: "america", town:{ name:"California" } } ]; const flatObject = (obj) => { return Object.assign( {}, ...function _flatten(o) { return [].concat(...Object.keys(o) .map(k => typeof o[k] === 'object' ? _flatten(o[k]) : ({[k]: o[k]}) ) ); }(obj) ) } let searchWord = 'California'; _data.forEach((el, i) => { let flattenedObject = flatObject(el); if (Object.values(flattenedObject).includes(searchWord)) _data = _data.filter((f, ind) => ind == i); }) console.log(_data);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.