查询Javascript对象(图)
Query a Javascript Object (graph)
我想在Javascript对象中搜索特定的键和值。例如
var obj = { zulu: { a: 3, b: "b3", d: true } };
查明obj是否包含值为3
的关键字a
。对象具有嵌套对象和嵌套对象数组,a: 3
可以位于对象图中的任意位置和多个位置。
所以我不能简单地测试:if ( zulu.a == 3 )
和a
可以在对象图中的多个位置。
我认为linq.js
看起来很有前途,但是当查询对象时,它似乎不会下降到嵌套对象中。也就是说,我对林克完全是个新手,可能会错过一些东西。
我可以(并且已经)编写代码来迭代处理这一问题的对象图,但我想找到一个像linq这样的通用库,它可以让我对任何JS对象执行特别查询。
也许您可以使用"级联深度优先"遍历嵌套图。
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表达式
戴夫。
相关文章:
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值