如何在 JSON 上应用复杂的数据过滤器,例如 SQL where 子句

Posted

技术标签:

【中文标题】如何在 JSON 上应用复杂的数据过滤器,例如 SQL where 子句【英文标题】:How to apply complex data filters like SQL where clause on JSON 【发布时间】:2012-12-19 02:30:23 【问题描述】:

我正在使用 Json 在客户端(javascript)表示数据,我将 .net 数据表对象转换为 json,现在需要对 Json 数据应用过滤器。我使用 _.where 来应用基本数据过滤器,但需要复杂的过滤器,例如:

where = (stundentID = 55 and school='abc') AND (City='xyz' or City ='abc')

它是我们在 Oracle 或 sql server 查询中使用的一种基本过滤类型。现在我如何使用 underscore.js 或 Json 或 javascript 结构上的一些等价物来应用这种机制。我可能还需要在 javascript 中使用聚合 [ Sum(sales)==500] 来查询获取 Top N 记录。等待您的宝贵建议。

谢谢,

【问题讨论】:

查看以下链接以供参考:***.com/questions/4720494/… 【参考方案1】:

假设您将此 JSON 表示为常规 JavaScript 对象(毕竟没有 JSON 对象之类的东西),您最好使用linq.js

您可以执行以下操作:

var studentFilteredArray = 
          Enumerable.From(students)
                    .Where(function(s)  return s.studenId == 55;  )
                    .OrderBy(function(s)  return s.LastName; )
                    .ToArray();

或者从你上面的例子:

.Where(function(s)  
      return s.studentID === 55 && s.school === 'abc' && (s.City === 'xyz' || s.City === 'abc') 
);

【讨论】:

这是 linq 问题还是 javascript 问题? @Saju - 这是一个 JavaScript 问题。我建议他使用 linq.js 实用程序来完成他想要的。 谢谢,一个不错的解决方案,虽然我有点担心它的性能。 @Adam Rackis:知道 linq.js 的效率有多高吗?与 underscore.js 之类的东西相比 @Adam Rackis:不用担心。为向我介绍它而干杯。【参考方案2】:

你也可以试试alasql.js,在这里你可以使用标准的SQL SELECT WHERE 语句。 Alasql 专门设计用于处理 JSON 数组,如数据库中的表。

// Create database and describe the table
var db = new alasql.Database();
db.exec('CREATE TABLE students ([studentID] INT, school STRING, [City] STRING)');

// Assign you array here
db.tables.students.data = [
       studentID: 55, school: 'abc', City:'abc',
       studentID: 56, school: 'klm', City:'xyz',
       studentID: 57, school: 'nyz', City:'xyz'
    ];

// Use regular SQL 
console.log(db.exec("SELECT * FROM students "
  +" WHERE ([studentID] = 55 AND school='abc') AND ([City]='xyz' OR [City] ='abc')"));

试试这个例子in jsFiddle。

【讨论】:

它看起来也是一个很有前途的选择,我一定会尝试一下。

以上是关于如何在 JSON 上应用复杂的数据过滤器,例如 SQL where 子句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSON 文件上运行的 GraphQL 上应用过滤器?

如何在json swift中过滤内容

如何在 AngularJS 中进行双向过滤?

仅在子级别上应用 jq 过滤器,保持 JSON 的其余部分完好无损

如何使用 javascript 过滤复杂的 json 对象?

如何在 iOS 中解析复杂的 json 数据?