我有一个SQL查询,用于过滤条件(属性)列表,但我需要将功能移动到严格的客户端。我在客户端上有完整的数据集,只需要知道在我的JSON / JS对象上模拟逻辑的最有效和最有效的方法。
SELECT id
FROM table_name
GROUP BY id
HAVING Count(id) >= @VALUES_COUNT
WHERE condition_column IN( @VALUES )
这是针对基于属性(标签)的过滤器。我可以在SQL中说出类似的内容:
SELECT fruit.fruitId
FROM fruit
INNER JOIN fruitAttributes ON fruitAttributes.fruitId = fruit.fruitId
GROUP BY fruit.fruitId
HAVING Count(fruit.fruitId) >= 2
WHERE fruitAttributes.id IN( 1, 2 )
*想象一下fruitAttrubutes 1是“HasSeeds”而2是“MakesJuice”例如
我的结果是所有条件匹配的fruitIds。
我可以使用的库是jQuery和下划线/ lodash.js
编辑:
客户端的对象在此结构中作为JSON从.NET传输。
[{
fruitId: 1,
name: "Granny Smith Apple",
color: "orange",
flattenedAttributes: "[HasSeeds][MakesJuice]",
attributes : [1, 2]
},
{
fruitId: 2,
name: "Banana",
color: "yellow",
flattenedAttributes: "",
attributes : []
}]
答案 0 :(得分:1)
我不是SQL向导,但我认为这会模拟您的查询:
var result = _.chain(data)
.filter(function (v) {
return _.contains(v.attributes, 1) || _.contains(v.attributes, 2)
})
.pluck('fruitId')
.countBy()
.reduce(function (m, v, k) {
if (v >= 2) {
m.push(+k);
}
return m;
}, [])
.value();
这是一个fiddle(由于小数据集的原因,它没有那么多)。虽然下划线似乎足以完成此任务,但您也可以查看类似TaffyDB的内容。
答案 1 :(得分:1)
这是使用下划线的版本。它不像自定义javascript那样高效,但它更容易看到:
var applesAndBananas = function(fruit){
return fruit.fruitId == 1 || fruit.fruitId == 2;
}
var moreThanOneFruit = function(groupedFruit){
return groupedFruit.length > 1;
}
var getFruitId = function(groupedFruits){
return groupedFruits[0].fruitId;
}
var fruitIds = _.chain(fruits)
.filter(applesAndBananas)
.groupBy('fruitId')
.filter(moreThanOneFruit)
.map(getFruitId)
.value();
答案 2 :(得分:-1)
根据我的理解,SQL查询正在做什么是设置交集,这就是为什么它如此快速。下划线也有这个功能,这是我最终使用_.intersection