在JavaScript中过滤JSON子对象

时间:2014-02-06 12:50:14

标签: javascript jquery json performance

我正在尝试过滤下面的“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",
   }
  ]
}

1 个答案:

答案 0 :(得分:3)

这很难。请参阅this fiddle

考虑:

  • 不使用过滤器对象中的对象。我使用了简单的数组:

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

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

    这将更加简单和合乎逻辑;

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

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

简而言之,我不确定它的工作是否100%。但它一试。如果你现在发现一些错误/错误。

我希望它有所帮助。

<强>更新

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

所以现在如果Color["Orange"]匹配,那么汽车必须匹配此颜色才能被选中,如果Color["Orange", "Red"],则汽车必须匹配Orange Red。像Color: []这样的过滤器会被忽略。