Запросите объект Javascript (график) - PullRequest
1 голос
/ 14 июня 2011

Я хочу искать в объектах Javascript определенный ключ и значение.ех.

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

Узнайте, содержит ли obj ключ a со значением 3.Объект имеет вложенные объекты и массивы вложенных объектов, и a: 3 может находиться в любом месте графа объекта и в нескольких местах.

Поэтому я не могу выполнить простой тест: if ( zulu.a == 3 ), поскольку a может быть внесколько мест в графе объектов.

Мне показалось, что linq.js выглядело очень многообещающе, однако при запросе объекта он, похоже, не спускался во вложенные объекты.Тем не менее, я - полный новичок в linq и, возможно, что-то упустил.

Я могу (и имею) написанный код для итерации графа объектов, который обрабатывает это, однако я бы хотел найти библиотеку общего назначения, такую ​​как linqчто позволило бы мне выполнить специальные запросы для любого объекта JS.

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

Я создатель linq.js. http://linqjs.codeplex.com/

Может быть, вы можете использовать «CascadeDepthFirst», который пересекает вложенный граф.

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'");
2 голосов
/ 14 июня 2011

Посмотрите на js-traverse . Вот leaves.js из README (также в 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);

Вместо проверки правдивости this.isLeaf я проверяю, чтобы он был ложным, чтобы он захватывал внутренние узлы, а не листья.

Код для js-traverse написан как модуль CommonJS, поэтому для его использования в браузере вам потребуется среда CommonJS, такая как RequireJS, или вы можете адаптировать код в index.js для использования глобального объекта.

0 голосов
/ 14 июня 2011

У меня нет знаний о Linq в JS только на C # и .NET.

Но в C # Linq поможет вам только найти элементы в коллекции, как вы обнаружили.

Чтобы решить эту проблему, я бы написал перечислитель, который обходил бы дерево, называемое, скажем, Preorder, тогда мой код C # выглядел бы так:

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

Учитывая, что у вас был такой перечислитель, я не понимаю, почему вы не могли тогда использовать с ним выражения linq.

Дэйв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...