此代码片段仅用于使用字符串值过滤对象数组。
那么如何使代码片段适合嵌套对象,以便它可以过滤对象数组以及其中的嵌套对象?
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"
}
}
]
最佳答案
需要扁平化对象,然后才能轻松过滤数组:
_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);
关于javascript - 在 JavaScript 中过滤嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347746/