【问题标题】:Filter an object of objects by key按键过滤一个对象
【发布时间】:2020-10-02 01:44:47
【问题描述】:

我有一个这样的对象

{
  "GroupA": {
    "Parent1": [1, 2, 3],
    "Parent2": [1, 2, 3],
    "Parent12": [1, 2, 3]
  },
  "GroupB": {
    "Parent13": [1, 2, 3],
    "Parent5": [1, 2, 3]
  },
  "GroupC": {
    "Parent7": [1, 2, 3]
  }
}

现在我想通过搜索 Parent 的名称来过滤这个对象 例如,当我搜索 parent1 时,结果应该是

{
  "GroupA": {
    "Parent1": [1, 2, 3],
    "Parent12": [1, 2, 3]
  },
  "GroupB": {
    "Parent13": [1, 2, 3],
  }
}

这是我的解决方案,但如果 Group 有许多相似的 Parent 名称,它只会返回第一个名称,则它无法正常工作。当我尝试设置状态时,它会像所有错误值一样过滤

let newData = []
let catalogArr = Object.entries(catalogList)

const handleSearchElement = (e) => {
        const value = e.target.value
        catalogArr.forEach(catalog => {
            let filteredKeys = Object.keys(catalog[1]).filter(name => name.toLowerCase().includes(value.toLowerCase()))
            let valuesOfKey
            if(filteredKeys[0]) {
                valuesOfKey = {
                    [filteredKeys[0]]: Object.values(catalog[1][filteredKeys[0]])
                }
                newData.push([catalog[0], {...valuesOfKey}])
            }
        })
        console.log(Object.fromEntries(newData));

        setCatalogList(Object.fromEntries(newData))
        // console.log(catalogList);
}

【问题讨论】:

    标签: reactjs algorithm object filter


    【解决方案1】:

    您可以使用Array#reduce 轻松完成此操作,但是,使用Object.entriesObject.fromEntries 将对象本质上视为数组的所有打包和解包对象表明您可能使用了错误的数据结构。

    如果您需要重复执行此操作,请考虑进行一次性转换,以安排 O(1) 访问的数据,例如,通过对内部键而不是外部键进行分组(很难说,因为我没有不知道数据或用例)。或者,如果您主要是迭代,请考虑使用数组。

    const data = {
      "GroupA": {
        "Parent1": [1, 2, 3],
        "Parent2": [1, 2, 3],
        "Parent12": [1, 2, 3]
      },
      "GroupB": {
        "Parent13": [1, 2, 3],
        "Parent5": [1, 2, 3]
      },
      "GroupC": {
        "Parent7": [1, 2, 3]
      }
    };
    
    const targetKey = "parent1";
    
    const res = Object.entries(data).reduce((a, [k, v]) => {
      const filtered = Object.entries(v).filter(([k, ]) => 
        k.toLowerCase().includes(targetKey.toLowerCase())
      );
      
      if (filtered.length) {
        a[k] = Object.fromEntries(filtered);
      }
      
      return a;
    }, {});
    
    console.log(res);

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2016-05-24
      相关资源
      最近更新 更多