【问题标题】:How to filter array by array of dynamic objects?如何按动态对象数组过滤数组?
【发布时间】:2019-10-27 02:56:30
【问题描述】:

我有一个庞大的数据集合 700 多个项目,我想通过对象的动态数组进行过滤,假设用户输入了 ode,我的脚本应该搜索每个过滤器,而无需我执行类似 @987654322 的操作@

const hugeData = [{name:"store 1",code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true},{name : "sto 3",code : "has no cde",available : true}...]

const filters = [{ code : "ode", name : "re" }]

我期待的结果是

// output
[{name : "store 1", code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true}]

我用lodash 解决了这个问题,但是功能很慢,代码很差,有没有其他方法可以做到这一点?

const results = []
_.map(hugeData, store => {
    _.map(filters, tag => {
        Object.keys(tag).map(tagOb => {
          if (store[tagOb] && store[tagOb].includes(tag[tagOb])) {
             results.push(store);
          }
        });
    });
});

【问题讨论】:

  • 不能filters 只是键值对的单个对象吗?为什么它需要在一个数组中?
  • @Anthony 是的,我可以修改它,但如果它是一个简单的对象,它应该如何工作?
  • 多个过滤器是否意味着它们都必须匹配?
  • ode 是什么?
  • @Anthony 不必全部匹配,只有一个匹配,结果应该会出现

标签: javascript arrays filter lodash


【解决方案1】:

您可以使用filtersome

const hugeData = [{ name: "store 1", code: "code 1",available: false}, { name: "store 2", code: "simple_code",available: true}, { name: "sto 3", code: "has no cde", available: true }]

const filters = { code: "ode", name: "re" }

let final = hugeData.filter(value => {
  return Object.entries(value).some(([key, value]) => {
    return typeof value == 'string' && value.includes(filters[key])
  })
})

console.log(final)

【讨论】:

    【解决方案2】:

    这可能更快 - 存储 Object.keys() 结果,并过滤掉不在第一个存储中的任何键(假设所有存储都是等效的)。我还为filters 使用了一个对象。

    const hugeData = [
      { name: "store 1", code: "code 1", available: false },
      { name: "store 2", code: "simple_code", available: true },
      { name: "sto 3", code: "has no cde", available: true }
    ];
    
    const filters = { code: "ode", name: "re" };
    const keys = Object.keys(filters).filter(k => hugeData[0].hasOwnProperty(k));
    
    console.log(
      hugeData.filter(s => keys.some(k => s[k].includes(filters[k])))
    );

    如果您希望所有过滤器都匹配,您可以将其更改为every

    hugeData.filter(s => keys.every(k => s[k].includes(filters[k])))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多