簡體   English   中英

在 JavaScript 中過濾嵌套對象

[英]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.

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