查询Javascript对象(图)

Query a Javascript Object (graph)

本文关键字:对象 Javascript 查询      更新时间:2023-09-26

我想在Javascript对象中搜索特定的键和值。例如

var obj = { zulu: { a: 3, b: "b3", d: true } };

查明obj是否包含值为3的关键字a。对象具有嵌套对象和嵌套对象数组,a: 3可以位于对象图中的任意位置和多个位置。

所以我不能简单地测试:if ( zulu.a == 3 )a可以在对象图中的多个位置。

我认为linq.js看起来很有前途,但是当查询对象时,它似乎不会下降到嵌套对象中。也就是说,我对林克完全是个新手,可能会错过一些东西。

我可以(并且已经)编写代码来迭代处理这一问题的对象图,但我想找到一个像linq这样的通用库,它可以让我对任何JS对象执行特别查询。

我是linq.js的创建者。http://linqjs.codeplex.com/

也许您可以使用"级联深度优先"遍历嵌套图。

var obj = { zulu: { a: 3, b: "b3", d: true } };
var query = Enumerable.From(obj)
    .CascadeDepthFirst(function (kvp)
    {
        return (kvp.Value instanceof Object) ? kvp.Value : []
    });
// query.ToArray() is
[0] = {Key: "zulu", Value: { a: 3, b: "b3", d: true }}
[1] = {Key: "a", Value: 3}
[2] = {Key: "b", Value: "b3"}
[3] = {Key: "d", Value: true}
// arrangement
var exists = query.Any("$.Key == 'a' && $.Value == '3'");

查看js遍历。以下是自述文件中的leaves.js(也在examples/leaves.js中),适用于您的示例:

var traverse = require('traverse');
var obj = { zulu: { a: 3, b: "b3", d: true } };
var nodes = traverse(obj).reduce(function (acc, x) {
    if ((! this.isLeaf) && x.a === 3) acc.push(x);
    return acc;
}, []);
console.dir(nodes);

与其检查这个。isLeaf是真的,我检查它是假的,这样它就可以捕获内部节点而不是叶子。

js遍历的代码是作为CommonJS模块编写的,因此要在浏览器中使用它,您需要像RequireJS这样的CommonJS环境,或者您可以调整index.js中的代码以使用全局对象。

我对JS中的Linq一无所知,只有C#和。NET。

但在C#中,Linq只会帮助您找到集合中的元素,正如您所发现的那样。

为了解决这个问题,我会写一个遍历树的枚举器,称为Preorder,然后我的C#代码看起来像:

foreach(Node n in obj.Preorder)
    if(n.key == "a" && n.value == "3")
    ...

既然你有这样一个枚举器,我不明白为什么你不能使用linq表达式

戴夫。