如何在javascript中过滤与此SQL查询中的GroupBy和have类似的对象?
我有一个SQL查询,用于过滤条件(属性)列表,但我需要将功能移到严格的客户端。我在客户端上有完整的数据集,只需要知道在JSON/JS对象上模拟逻辑的最有效的方法如何在javascript中过滤与此SQL查询中的GroupBy和have类似的对象?,javascript,sql,underscore.js,Javascript,Sql,Underscore.js,我有一个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
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 )
*例如,假设水果属性1是“HasSeeds”,2是“MakesJuice”
我的结果是所有条件都匹配的子实体
我可以使用的库是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 : []
}]
我不是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();
这里有一个例子(因为数据集很小,所以没什么作用)。虽然下划线似乎足以完成此任务,但您也可以查看类似TaffyDB的内容。这里有一个使用下划线的版本。它不会像定制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();
根据我的理解,SQL查询所做的是设置交集,这就是为什么它如此快的原因。下划线也有一个用于此的函数,这就是我最后使用的u.intersection你所说的“到javascript的端口”是什么意思?您正在尝试查询Web SQL吗?你是在查询内存中的对象吗?@BenCollins我在处理内存中的对象,试图找到使用基于内存的构造筛选数据集的最佳方法。然后我建议你编辑你的问题,说一些类似于“如何使用与此SQL查询相同的逻辑筛选javascript中的对象?”当然,其他问题指南仍然适用。仔细阅读,然后编辑你的问题,它可能会被重新打开。