我一直在寻找一种方法来执行复杂的查询,比如SQL可以执行,但完全是客户端。我知道我可以通过服务器上的SQL查询得到我想要的确切结果,我甚至可以使用它来使它看起来很流畅。但是,出于可扩展性,性能和带宽的原因,我更愿意在所有客户端执行此操作。
一些要求:
我查看了stackoverflow并找到了jslinq,但它最后一次更新是在2009年,没有文档。我也无法判断它是否可以执行更复杂的查询,例如在两个不同的列上进行排序或执行“和”或“或”过滤。
我认为这样的事情已经完成了。我知道HTML5从这条路开始,但后来遇到了障碍。我只需要基本的查询,没有连接或任何东西。有谁知道可以做到这一点的事情?感谢。
编辑:我认为我应该包含一个用例来帮助澄清我正在寻找的内容。
例如,我列出了美国5000个最大的城市。每条记录包括城市名称,州和人口。我希望能够下载整个数据集一次并使用它填充JS数组,然后,仅在客户端,能够运行如下的查询,并从结果记录中创建一个表。
所有这些查询都可以通过SQL完成,但我不想继续往返于服务器,我也希望允许离线使用。
答案 0 :(得分:10)
它可以轻松满足您的所有要求。
答案 1 :(得分:5)
只要数据可以作为对象数组在内存中,您就可以使用sort
和filter
。例如,假设您要过滤产品。您希望找到低于5美元或高于100美元的所有产品,并且您希望按价格(升序)排序,如果有两种产品具有相同价格,则按制造商排序(降序)。你可以这样做:
var results = products.filter(function(product) {
// price is in cents
return product.price < 500 || product.price > 10000;
});
results.sort(function(a, b) {
var order = a.price - b.price;
if(order == 0) {
order = b.manufacturer.localeCompare(a.manufacturer);
}
return order;
});
对于跨浏览器兼容性,只需填充filter
。
答案 2 :(得分:4)
试试Alasql.js。这是一个javascript客户端SQL数据库。
您可以使用连接和分组进行复杂查询,甚至可以优化连接和部件。它不使用WebSQL。
您的要求支持:
这是一个简单的例子(在jsFiddle中播放):
// Fill table with data
var person = [
{ name: 'bill' , sex:'M', income:50000 },
{ name: 'sara' , sex:'F', income:100000 },
{ name: 'larry' , sex:'M', income:90000 },
{ name: 'olga' , sex:'F', income:85000 },
];
// Do the query
var res = alasql("SELECT * FROM ? person WHERE sex='F' AND income > 60000", [person]);
答案 3 :(得分:0)
Yahoo的YQL怎么样?我只是简单地看了一下,但它看起来很有趣。
答案 4 :(得分:0)
Backbone是一个非常好的js库(他们的话)“通过提供具有键值绑定和自定义事件的模型,具有可枚举函数的丰富API的集合,具有声明性事件的视图,为Web应用程序提供结构处理,并通过RESTful JSON接口将其全部连接到您现有的API。“
我不确定这是否是您正在寻找的,但您可以使用它来模拟您的模型并将事件侦听器绑定到它。 This似乎是一个很好的教程,可以完成它的一些基本用途。
答案 5 :(得分:0)
您可以使用CanJS。它是一个相对较新的库,其性能优于Backbone和其他基于臭名昭着的JavaScript MVC库。实际上,它是JS MVC的MVC部分,含有一些香料。
您可以通过net.tutsplus.com http://net.tutsplus.com/tutorials/javascript-ajax/diving-into-canjs-part-3/
查看此tut它非常强大而且快速。具有活动装订等功能,让您的生活变得轻松。
答案 6 :(得分:0)
Coils是一个Clojurescript框架,它编译为Javascropt并且具有这样的客户端SQL查询:
(go
(log (sql "SELECT * FROM test_table where name = ?" ["shopping"] )))
:它是传递给服务器端关系数据库的完整SQL: