过滤JavaScript中的嵌套对象

过滤JavaScript中的嵌套对象,javascript,arrays,object,Javascript,Arrays,Object,此代码段仅用于使用字符串值筛选对象数组 那么,如何使代码片段适应嵌套对象,以便它可以过滤对象数组以及其中的嵌套对象呢 mainLogic=(\u数据,搜索)=>{ //_数据是一个对象数组 让_allsearch=search.trim().toLowerCase(); 如果(_allsearch.length>0){ _数据=对象。值(_data)。过滤器((obj)=>{ 返回Object.keys(obj).some((key)=>{ //当代码遇到嵌套对象时,代码通常在此点中断 返回ob

此代码段仅用于使用字符串值筛选对象数组

那么,如何使代码片段适应嵌套对象,以便它可以过滤对象数组以及其中的嵌套对象呢

mainLogic=(\u数据,搜索)=>{
//_数据是一个对象数组
让_allsearch=search.trim().toLowerCase();
如果(_allsearch.length>0){
_数据=对象。值(_data)。过滤器((obj)=>{
返回Object.keys(obj).some((key)=>{
//当代码遇到嵌套对象时,代码通常在此点中断
返回obj[key].toLowerCase().includes(_allsearch);
});
});
}
返回数据;
};
这是一个示例对象:

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数据=[{
id:“1”,
名字:“珍贵”,
姓氏:“相同”,
年龄:"29岁",,
国家:“Abia”,
电子邮件:“sam@gmail.com",
国家:“密歇根”,
城镇:{
姓名:“何塞”
}
},
{
id:“2”,
名字:“博鲁”,
姓:“笑话”,
年龄:"32岁",,
国家:“奥贡”,
电子邮件:“博鲁。joke@outlook.com",
国家:“美国”,
城镇:{
姓名:“加利福尼亚”
}
}
];
函数对象(ob){
var toReturn={};
用于(ob中的var i){
如果(!ob.hasOwnProperty(i))继续;
如果((对象的类型[i])=='object'){
var flatObject=flatObject(ob[i]);
用于(flatObject中的变量x){
如果(!flatObject.hasOwnProperty(x))继续;
t返回[i+'.+x]=flatObject[x];
}
}否则{
toReturn[i]=ob[i];
}
}
回归回归;
};
功能主逻辑(数据、搜索){
对于(让obj表示数据){
展平=展平对象(obj);
if(Object.values(flatted).includes(search))返回obj;
};
};

log(mainLogic(data,“California”)
免责声明:代码主要来自

我只是将对象展平,这样每个属性都在同一层上,而不需要满足嵌套对象的需要。之后,过滤的方式与您现在的方式相同。(忽略验证和错误检查,您可以调整代码)

let数据=[{
id:“1”,
名字:“珍贵”,
姓氏:“相同”,
年龄:"29岁",,
国家:“Abia”,
电子邮件:“sam@gmail.com",
国家:“密歇根”,
城镇:{
姓名:“何塞”
}
},
{
id:“2”,
名字:“博鲁”,
姓:“笑话”,
年龄:"32岁",,
国家:“奥贡”,
电子邮件:“博鲁。joke@outlook.com",
国家:“美国”,
城镇:{
姓名:“加利福尼亚”
}
}
];
函数对象(ob){
var toReturn={};
用于(ob中的var i){
如果(!ob.hasOwnProperty(i))继续;
如果((对象的类型[i])=='object'){
var flatObject=flatObject(ob[i]);
用于(flatObject中的变量x){
如果(!flatObject.hasOwnProperty(x))继续;
t返回[i+'.+x]=flatObject[x];
}
}否则{
toReturn[i]=ob[i];
}
}
回归回归;
};
功能主逻辑(数据、搜索){
对于(让obj表示数据){
展平=展平对象(obj);
if(Object.values(flatted).includes(search))返回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\u数据=[
{
id:“1”,
名字:“珍贵”,
姓氏:“相同”,
年龄:"29岁",,
国家:“Abia”,
电子邮件:“sam@gmail.com",
国家:“密歇根”,
城镇:{
姓名:“何塞”
}
},
{
id:“2”,
名字:“博鲁”,
姓:“笑话”,
年龄:"32岁",,
国家:“奥贡”,
电子邮件:“博鲁。joke@outlook.com",
国家:“美国”,
城镇:{
姓名:“加利福尼亚”
}
}
];
常量flatObject=(对象)=>{
返回Object.assign(
{},
…函数_展平(o){
返回[].concat(…Object.keys(o)
.map(k=>
o[k]=“对象”的类型?
_展平(o[k]):
({[k]:o[k]})
)
);
}(obj)
)
}
让searchWord='California';
_data.forEach((el,i)=>{
设展平对象=展平对象(el);
if(Object.values(扁平对象).includes(searchWord))
_数据=_data.filter((f,ind)=>ind==i);
})

console.log(_数据)有必要将对象展平,然后可以轻松过滤阵列:

_data.forEach((el, i) => {
  let flattenedObject = flatObject(el);
  if (Object.values(flattenedObject).includes(searchWord))
    _data = _data.filter((f, ind) => ind == i);
})
例如:

let\u数据=[
{
id:“1”,
名字:“珍贵”,
姓氏:“相同”,
年龄:"29岁",,
国家:“Abia”,
电子邮件:“sam@gmail.com",
国家:“密歇根”,
城镇:{
姓名:“何塞”
}
},
{
id:“2”,
名字:“博鲁”,
姓:“笑话”,
年龄:"32岁",,
国家:“奥贡”,
电子邮件:“博鲁。joke@outlook.com",
国家:“美国”,
城镇:{
姓名:“加利福尼亚”
}
}
];
常量flatObject=(对象)=>{
返回Object.assign(
{},
…函数_展平(o){
返回[].concat(…Object.keys(o)
.map(k=>
o[k]=“对象”的类型?
_展平(o[k]):
({[k]:o[k]})
)
);
}(obj)
)
}
让searchWord='California';
_data.forEach((el,i)=>{
设展平对象=展平对象(el);
if(Object.values(扁平对象).includes(searchWord))
_数据=_data.filter((f,ind)=>ind==i);
})

console.log(_数据)