【问题标题】:where function of Linq.js on Json data not workingJson 数据上 Linq.js 的功能在哪里不起作用
【发布时间】:2013-01-08 18:05:04
【问题描述】:

如何更正以下代码以获得所需的输出,

var Data = [{ "A": -27, "B": -39 }, { "A": 28, "B": 0}]

var filter = "x[A]==28";

var findItem = Enumerable.From(Data)
 .Where(function (x) { return filter ; })
 .ToArray();

alert(findItem.length);

$.each(findItem, function (i, value) {
alert(value["A"]);
});

它应该给我一个值A:28或完成一个记录{“A”:28,“B”:0},为什么我得到两个值,如何得到正确的结果?

从以下路径使用“linq.js”: [https://raw.github.com/gist/1175460/fb7404d46cab20e31601740ab8b35d99a584f941/linq.js]

JSfiddle 上的代码:http://jsfiddle.net/Irfanmunir/gLXNw/2/

【问题讨论】:

  • 您正在返回一个字符串,它是“truthy”(评估为 true)。您可能希望在 where 回调中实际评估您的过滤器:.Where(function (x) { return x['A'] == 28; })
  • 它不起作用,因为我正在为 where 子句传递变量字段。下面提到的解决方案有效
  • 能否更新一下linq.js 路径。你给的路径坏了,所以所有的jsfiddle都不起作用。

标签: javascript underscore.js linq.js


【解决方案1】:

您的过滤器是一个始终评估为真的字符串。将您的过滤器放在一个函数中:

var filter = function(x) { return x['A'] === 28 };

并使用它:

.Where(filter)

查看更新的小提琴:http://jsfiddle.net/gLXNw/4/

【讨论】:

  • 我需要一个变量中的 x['A'] === 28,所以我可以在运行时创建过滤器并将其传递给 where 子句。
  • 那么使用@pimvdb的解决方案应该没问题
【解决方案2】:

您要么必须传递谓词函数,要么必须传递表示此类函数的字符串。您正在传递一个函数,因此 linq.js 不会期望另一个函数/字符串。

对于 Linq.js,您必须对字符串使用以下语法:

var filter = "x => x['A']==28";  // also note the quotes surrounding A

然后你将这个函数字符串传递给.Where:

.Where(filter)

你当然也可以内联这个:

.Where("x => x['A']==28")

http://jsfiddle.net/gLXNw/3/

【讨论】:

  • 我更喜欢你的回答 ;-)
  • @hereandnow78 该语法反映了 Linq 语法,但如果这样做会对性能造成重大影响,我不会感到惊讶。
  • @Shmiddty:我不知道它是怎么实现的,但是这样的字符串只需要解析一次,之后真正生成的函数可以重复使用。
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多