【问题标题】:Filtering through JSON sub-objects in JavaScript在 JavaScript 中过滤 JSON 子对象
【发布时间】:2014-02-06 12:50:14
【问题描述】:

我正在尝试过滤下面的“carObj”,因为用户从页面上的列表中选择“过滤器”并仅显示“匹配”子对象。

当前,当用户选择“过滤器”时,它会添加到“filterObj”中,然后我会使用 8 个 $.each 语句在“carObj”中滚动以提取所有匹配的子对象。我正在匹配这些值并多次滚动以使其到达那里。

例如,假设下面的示例,只有“carObj”中的第 3 个子对象会与其所有值一起“返回”。就目前而言,我将所有匹配的属性设置为“TRUE”,将所有匹配的属性设置为“FALSE”。

然后在网页上,我滚动浏览“carObj”中所有 TRUE 值的子对象,并在表格中显示它们的信息/值。

我不确定这是否是最有效的方法。

 /* Object filled as user selects "filters" */
 filterObj ={
    "Seats": {},
    "color": {
        "Orange": "Orange",
         "Red": "Red"
        },
    "Transmission": {
        "Manual": "Manual"
    },
    "Make": {
        "Ford": "Ford"
    },
    "Model": {},
    "Status": {
        "New": "New"
        }

}

/* Main object that contains all cars */
carObj = {
  "cars": [
   {
      "seats":"6",
      "color":"Red",
      "transmission":"Automatic",
      "make":"Ford",
      "model":"Windstar",
      "status":"New",
   },
   {
      "seats":"4",
      "color":"Black",
      "transmission":"Manual",
      "make":"Mazda",
      "model":"CRX",
      "status":"New",
   },
   {
      "seats":"2",
      "color":"Orange",
      "transmission":"Manual",
      "make":"Ford",
      "model":"Galaxy",
      "status":"New",
   }
  ]
}

【问题讨论】:

    标签: javascript jquery json performance


    【解决方案1】:

    那是一个艰难的过程。见this fiddle

    注意事项:

    • 过滤器对象中的对象没有用处。我为此使用了简单的数组:

      "color": {
          "Orange": "Orange",
          "Red": "Red"
      },
      

      "color": ["Orange", "Red"],
      

      会更简单,更有逻辑;

    • 我已将键更改为所有数组和对象中的第一个大写字母。否则,算法将不得不关注它,并根据其功能对其进行调整。我将它修复为脚本变得更小,但如果需要它可以使用非标准键名;

    • 该函数返回来自carObj 的任何与任何过滤器匹配的对象,而不是所有过滤器。但是可以制作。

    简而言之,我不太确定它是否 100% 工作。但它是一个尝试。如果您发现一些错误/错误,请立即告诉我。

    希望对你有帮助。

    更新:

    我已更新代码以匹配所有过滤器,每个过滤器至少有一个值。见this Fiddle

    所以现在如果它有Color["Orange"],汽车必须匹配这个颜色才能被选中,如果Color["Orange", "Red"],那么汽车必须匹配Orange RedColor: [] 之类的过滤器会被忽略。

    【讨论】:

    • 谢谢!该数组更有意义。过滤器对象感觉不对。我正在玩小提琴,这对我来说有点复杂,但我在进行控制台日志记录。似乎它正在退出任何比赛,而不是“全部”比赛。当我控制台注销“cars[n][f[i]]”和“cars[n][f[i]]”时,它会显示“red”、“manual”和“orange”的匹配项。然而,唯一真正匹配的是带有手册的橙色汽车。我会继续玩它,但如果你有什么想法,请告诉我。
    • @Robert yes 匹配任何属性。它应该只匹配所有?
    • 是的,它只会产生一个“匹配”。任何具有倍数的东西,比如“橙色”和“红色”作为颜色,都是“或”的情况。就像,我不知道你是否熟悉 MySQL,但如果它是一个 DB:[SELECT * from carObj WHERE (color = "orange" OR color = "red") AND transmission = “手动”和status = “新”]。不确定这是否或多或少令人困惑......
    • @Robert 我更新了 Fiddle 以适应您描述的 查询。看帖子更新。
    • 看起来工作最出色,比我原来的函数简洁约 10 倍。我对对象缺乏理解的一个很好的教训。我将比较这两个小提琴并尝试从中提取尽可能多的信息。感谢您的努力。
    猜你喜欢
    • 2019-10-02
    • 2017-01-25
    • 2019-10-30
    • 2023-04-09
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多