如何在javascript中过滤类似于GroupBy和在此SQL查询中拥有的对象?

时间:2014-03-07 20:09:58

标签: 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 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 : [] 
}]

3 个答案:

答案 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