【问题标题】:How to filter for multiple values within a long list of JSON data in JS? [duplicate]如何在JS中的一长串JSON数据中过滤多个值? [复制]
【发布时间】:2023-03-06 12:39:02
【问题描述】:

我有一个 JSON 中多个项目的列表,如下所示:

[
  {
    IsValid: true, 
    forSale: false,
    Color: red,
    value: 22
  },
  {
    IsValid: false, 
    forSale: true,
    Color: blue,
    value: 123
  }
]

然后用户将选择过滤器来搜索列表,例如:

[color: red, forSale: true, value over 10]

通过 JSON过滤多个值的最简单方法是什么?

我尝试将过滤后的选项作为对象,例如:

{forSale: true, color: blue}

然后执行 JSON 的 forEach,并使用过滤选项的嵌套 Object.map,但如果有两个或多个项目,则 Object.mapping 不会返回正确的结果。

对于多个选项,您将如何过滤 JSON 中的一长串项目?

【问题讨论】:

  • 您没有 JSON 数据。关于非常重要的技术点:“JSON”是字符串序列化的数据形式。在你解析它之前它什么都不是。你不能forEach它,你不能Object.map它,你必须先解析它,此时它停止是JSON并成为常规JS对象的常规JS数组,因此,您的问题实际上是关于如何使用多个键/值过滤一组普通对象,并且在 SO 和整个网络上已经有了答案。
  • 好吧,很公平 - 你是对的,它不是 JSON。至于答案 - 我看了看,发现在 forEach 中使用了嵌套的 object.map 并且它没有正确返回我需要的东西,所以因为我整天都在努力解决它并且找不到我问的任何东西。您有可以提供的链接或建议吗?
  • “数据”不会告诉任何人你在处理什么:你有一个普通对象数组。
  • 与欺骗目标的唯一区别是您需要使用条件手动比较“超过 10 的值”。
  • 谢谢@ggorlen 我已经试一试了!欣赏它。

标签: javascript json


【解决方案1】:
const filters = [{label: 'forSale', value: false}, {label: 'color', value: 'red'}];
const filteredArray = array.filter(item => filters.every(filter => item[filter.label] === filter.value))

const filters = {forSale: true, color: 'blue'}; 
const filteredArray = array.filter(item => {
    let result = true;
    for(let key in filters) {
        if (item[key] !== filters[key]){
            result = false;
            break;
        }
    }
    return result;
})

const filters = {forSale: true, color: 'blue'};
const filteredArray = array.filter(item => Object.keys(filters).every(key => item[key] === filters[key]))

【讨论】:

  • 欢迎来到 SO!正确的想法,但我认为 OP 想要“超过 10 的值”而不是“值正好 10”,其中 10 可以是任何数字。好的答案通常会提供一些解释,并且可能会提供指向您正在使用的函数的文档的链接。此外,这个特定的问题是一个相当明确的骗局,因此通常将其关闭以将信息保存在一个地方。
  • 我可以再次检查返回结果中的值是否超过 10,尽管我确信有更好的方法
猜你喜欢
  • 2019-03-25
  • 2020-11-14
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多