2011-06-13 9 views
1

특정 키와 값에 대해 자바 스크립트 개체를 검색하고 싶습니다. 예. obj가 값 3와 키 a 포함되어있는 경우 자바 스크립트 개체 쿼리 (그래프)

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

을 알아보십시오. 객체에는 중첩 객체와 중첩 객체 배열이 있으며 a: 3은 객체 그래프와 여러 위치에있을 수 있습니다.

간단한 테스트를 할 수 없습니다. if (zulu.a == 3)으로 a은 개체 그래프의 여러 위치에있을 수 있습니다.

제가 생각하기에 linq.js은 매우 유망 해 보였습니다. 그러나 객체를 쿼리 할 때 중첩 된 객체로 내려 앉는 것처럼 보이지는 않습니다. 그건 내가 linq에 대한 완전한 newb이고 아마 뭔가를 놓친다 고 말했다.

필자는 이것을 처리하는 객체 그래프를 반복 할 수있는 코드를 작성할 수 있지만 linq과 같은 일반적인 목적의 라이브러리를 찾고 싶습니다.이 라이브러리는 모든 JS 객체에 대해 임의의 쿼리를 수행 할 수있게 해줍니다.

+1

끔찍한 생각이 들지 않으면 'var found = false; JSON.stringify (obj, function (key, value)) { if (key === "a"&& value === 3) {found = true;} 반환 값 : }), ' – david

+0

감사합니다. 내가 생각했던 것. 그것은 다소 해킹이라고 말했다. 또한 객체 (그래프)는 상당히 커질 수 있으므로 성능 또한 중요한 문제입니다. – nevf

+0

해킹 괴물입니다. D : – david

답변

2

js-traverse을 살펴보십시오. 여기에 귀하의 예에 적용 (또한 examples/leaves.js 단위) README에서 leaves.js있어 :

대신 오히려 잎보다 내부 노드를 캡처 그래서 falsy 될 때까지 내가 확인하고 있습니다 truthy로 this.isLeaf 검사의
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); 

.

js-traverse의 코드는 CommonJS 모듈로 작성되므로 브라우저에서 사용하려면 RequireJS와 같은 CommonJS 환경이 필요하거나 index.js의 코드를 사용하여 전역 개체를 대신 사용할 수 있습니다.

+0

감사합니다. Ben, 유망 해 보입니다. 나는 그것을 밖으로 시도 할 것이다. 이상적으로 linq이 제공하는 컬렉션의 열거 형 등을 사용하고 싶습니다. 그러나 지금은해야합니다. – nevf

0

JS의 C# 및 .NET에서만 Linq에 대한 지식이 없습니다.

그러나 Linq는 발견 한대로 컬렉션 내의 요소를 찾는 데 도움이됩니다.

내가라는 나무를 산책하는 열거 쓰기 것을 해결하기 위해, 말, 예약 주문, 그때 내 C# 코드는 같을 것이다 : 당신이 그런 열거했다 감안할

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

, 난 몰라 왜 그걸로 linq 표현식을 사용할 수 없었는지 알아봐.

데이브.

+0

Dave, 답장을 보내 주셔서 감사합니다. 필자는 이미 객체 열거자를 작성했으며 linq.js를 사용할 수 있지만 전체 태스크를 수행하기위한 질의를 작성할 수있는 더 많은 '하나의'솔루션을 찾고있었습니다. 나는/linq 개체에 '이 기능을 가지고 나타나지 않거나 linq.js 단순히 짧은 오는 것 같습니다 놀랐습니다. – nevf

5

저는 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'"); 
+0

답안과 코드 예제에 감사드립니다. 나는 linq에 익숙하지 않고 당신의 예제가 실제로하는 것을 충분히 이해하지 못한다. 나는 [link] (http://neue.cc/reference.htm)에서 많은 도움이되지 않은 참고 문헌을 보았다. linq.js에 대한보다 광범위한 영어 문서를 만들 계획이 있습니까? – nevf

+1

도와 드리겠습니다. [101 LINQ Samples] (http://msdn.microsoft.com/en-us/vcsharp/aa336746)는 C#과 동일하므로 원칙 및 동작을 참조 할 수 있습니다. 나는 추가적인 방법과 JavaScript에 특유한 측면에 대한 설명이 부족하다는 것을 부인할 수 없다. 제가 생각하기는하지만, 문서의 개선은 심각합니다. (영어가 약하기 때문에 ...)하지만 저는 조금씩 최선을 다합니다. – neuecc

관련 문제