【问题标题】:Filter Array with objects based on another array dynamically使用基于另一个数组的对象动态过滤数组
【发布时间】:2021-11-21 16:43:15
【问题描述】:

使用基于另一个数组的对象动态过滤数组。

我需要使用另一个数组过滤一个主数组。但是过滤器数组只会包含几个字段或几个。

    var codes = [{
"title": "lore",
"city": "New York",
"desc": "lorem lorem",
"age": "32"
 },
{
    "title": "lore2 ",
    "city": "Santa Monica",
    "desc": "lorem2",
    "age": "20"
  }

];

let filter = [{
  "city": "New York"
}, {
  "age": "20"
},

...或更多过滤器。这个过滤器是由点击复选框的人动态创建的。

]

【问题讨论】:

  • 为什么你的filter 是一个数组?使它成为对象更有意义。没有?
  • 想要的结果是什么?请添加您的代码。

标签: javascript arrays filter array.prototype.map


【解决方案1】:

您可以采用更易于使用的更好的数据结构来代替未知键。

结果你得到所有键/值都匹配的对象。

const
    codes = [{ title: "lore", city: "New York", desc: "lorem lorem", age: "32" }, { title: "lore2 ", city: "New York", desc: "lorem2", age: "20" }],
    filter = [{ key: "city", value: "New York" }, { key: "age", value: "20" }],
    result = codes.filter(o => filter.every(({ key, value }) => o[key] === value));

console.log(result);

【讨论】:

  • 有趣的想法。 ty
【解决方案2】:

试试下面的代码示例,我想你想要什么;

尝试直接获取过滤器对象而不是另一个数组;

var 代码 = [{ “标题”:“传说”, “城市”:“纽约”, "desc": "lorem lorem", “年龄”:“32” }, { “标题”:“lore2”, “城市”:“圣莫尼卡”, “desc”:“lorem2”, “年龄”:“20” } ];

let filters = [{
  "city": "Santa Monica"
}, {
  "age": "20"
}];

const filterCode = {};
filters.forEach(filter => {
  for (var key of Object.keys(filter))
    filterCode[key] = filter[key];
});
var filteredCodes = codes.filter(code => {
  for (var key of Object.keys(filterCode)) {
      if(code[key] !== filterCode[key])
        return false;
  }
  return true;
});

console.log(filteredCodes);

【讨论】:

    【解决方案3】:

    这应该可以工作

    let codes = [{
        "title": "lore",
        "city": "New York",
        "desc": "lorem lorem",
        "age": "20"
      },
      {
        "title": "lore2 ",
        "city": "Santa Monica",
        "desc": "lorem2",
        "age": "20"
      }
    ];
    
    let filter = [{
      "city": "New York"
    }, {
      "age": "20"
    }];
    
    let res = codes.filter(code => {
      return filter.every(f => {
        const [key, value] = Object.entries(f)[0];
        return code[key] == value
      });
    });
    
    console.log(res)

    【讨论】:

    • 完美运行。 Tyvm
    【解决方案4】:

    也许这样的东西对你有用?

    基本上循环通过过滤器,然后还通过单独的过滤器对象键值对并根据代码检查它们。

    var codes = [{
      "title": "lore",
      "city": "New York",
      "desc": "lorem lorem",
      "age": "32"
    },
    {
      "title": "lore2 ",
      "city": "Santa Monica",
      "desc": "lorem2",
      "age": "20"
    }];
    
    var filters = [{"city": "New York"}, {"age": "32"}];
    
    
    function filterByMultipleFilters(data, filters) {
      return data.filter(item => {
        // Loop through all filters and check the current item
        for (const filter of filters) {
          for (const [key, value] of Object.entries(filter)) {
            if (!item[key] || item[key] !== value)
              return false;
          }
        }
        return true;
      });
    }
    
    console.clear();
    let result = filterByMultipleFilters(codes, filters);
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 2013-02-12
      • 2022-11-30
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多