javascript - 在 JavaScript 中过滤嵌套对象

标签 javascript arrays object

此代码片段仅用于使用字符串值过滤对象数组。

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

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/

相关文章:

java - 在不实现接口(interface)的情况下将对象分配给接口(interface)变量

Javascript:根据子对象值在数组中抓取对象

javascript - 向路由添加其他信息 - TypeScript 的解决方法?

javascript - Coffeescript 解析意外错误 '.'

javascript - 比较数组以确定获胜条件

java - 井字棋(有条件)

java - Java Integer 和 Double 对象是否有不必要的开销?

javascript - 按名称的特定部分搜索元素

javascript - 在 Angular.Js 完成内容加载后加载 JavaScript

javascript - React JS - Firebase使用map方法在组件中显示数据