如何在javascript中过滤与此SQL查询中的GroupBy和have类似的对象?

如何在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

我有一个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 )
*例如,假设水果属性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中的对象?”当然,其他问题指南仍然适用。仔细阅读,然后编辑你的问题,它可能会被重新打开。