2014-02-06 34 views
4

我试图通过下面的“carObj”进行筛选,因为用户从页面上的列表中选择“筛选器”并仅显示“匹配”子对象。通过JavaScript中的JSON子对象进行筛选

当前,当用户选择一个“过滤器”它被添加到“filterObj”,然后我滚动通过“carObj”像8 $ .each语句拉出所有匹配的子对象。我在价值观上进行匹配,并多次滚动来实现它。例如,假设下面的例子,只有“carObj”中的第三个子对象将被“返回”,并带有它的所有值。就其本身而言,我将所有匹配的属性设置为“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", 
    } 
    ] 
} 

回答

3

这是一个艰难的。请参阅this fiddle

注意事项:

  • 没有用在你的过滤器对象的对象。我用于简单阵列:

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

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

    这将是更简单和逻辑;

  • 我已经改变了所有数组和对象中大写字母的第一个字母。算法不得不关注它的其他方式,并沿着它的功能进行调整。我将其固定到脚本变得更小,但如果它希望它可以处理非标准键名;

  • 该函数返回从carObj匹配任意过滤条件,并非全部的任何物体。但它可以做到。

总之我不太确定它的工作是否100%。但它是一个尝试。如果你发现一些错误/错误让我现在。

我希望它有帮助。

UPDATE:

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

所以,现在如果富人Color["Orange"]车有这种颜色的顺序相匹配来选择,如果Color["Orange", "Red"],那么汽车必须匹配OrangeRed。像Color: []这样的过滤器将被忽略。

+0

谢谢!这个数组更有意义。过滤器对象只是感觉不对。我正在穿过小提琴,对我来说有点复杂,但我正在进行控制台录音。看起来好像是在任何比赛中都拉出来,而不是“全部”的比赛。当我在控制台注销“cars [n] [f [i]]”和“cars [n] [f [i]]”时,它会显示“红色”,“手动”和“橙色”的匹配。但唯一真正的匹配是带有手册的橙色汽车。我会继续玩,但如果你想出点什么,请告诉我。 – Robert

+0

@Robert yes与任何属性匹配。它应该只与所有人匹配? – DontVoteMeDown

+0

是的,它只会产生一个“匹配”。任何具有倍数的东西,比如“橙色”和“红色”都是“OR”情况。就像我不知道你是否熟悉MySQL,但是如果它是一个DB:[SELECT * from'carObj' WHERE('color' =“orange”or'color' =“red”)AND'transmission' = “手动”和“状态”=“新”]。不知道这是多少有点混淆...... – Robert

相关问题