2017-03-24 10 views
-1

의 아래 그림과 같이 내가 JSON 객체의 배열을 가지고 있다고 가정 해 봅시다 : 쿼리 중첩 된 JSON 배열

[{ "id": 1, 
    "name": "Leanne Graham", 
    "username": "Bret", 
    "email": "[email protected]", 
    "address": { 
    "suite": "Apt. 556", 
     "city": "Gwenborough", 
     "zipcode": "92998-3874", 
     "geo": { 
     "lat": "-37.3159", 
     "lng": "81.1496" 
     } 
    }, 
    "company": { 
     "name": "Romaguera-Crona", 
     "catchPhrase": "Multi-layered client-server neural-net", 
     "bs": "harness real-time e-markets" 
    }, 
    "hobbies":['cricket', 'football']},{ 
    "id": 2, 
    "name": "Graham", 
    "username": "David", 
    "email": "[email protected]", 
    "address": { 
     "street": "Kulas Light", 
     "suite": "Apt. 556", 
     "city": "San Jose", 
     "zipcode": "92998-3874", 
     "geo": { 
     "lat": "39.3159", 
     "lng": "121.1496" 
     } 
    }, 
    "phone": ["1-770-736-8031 x56442", "4087917884", "4089088939"], 
    "website": "hildegard.org", 
    "dept":[{"name":"divya", "address":"abc"},{"name":"divya1", "address":"abc1"}], 
    "hobbies":['baseball']}] 

지금 내가 키를 중첩 될 수있는 특정 키와 키를 기준으로 데이터를 얻을 싶어 또한. 'name', 'username', 'city', 'lat', 'lng'와 같이이 키의 데이터 만 가져오고 싶다는 예를 들어 보겠습니다. 출력은 다음과 같이 표시됩니다 :

[{ 
    name:'Leanne Graham', 
    username:'Bret', 
    address.city:'Gwenborough', 
    address.geo.lat:"-37.3159", 
    address.geo.lng: "81.1496" 
}, 
{ 
    name:'Graham', 
    username:'David', 
    address.city:'San Jose', 
    address.geo.lat:"39.3159", 
    address.geo.lng: "121.1496 
}] 

누구나 NodeJS에서이 작업을 수행 할 수 있습니까?

답변

-1

종속성을 설치하기 위해 열려있는 경우 lodash.get을 찾을 수 있습니다.

npm i --save lodash.get 

이가 당신을 수 있습니다 : 당신이 당신의 요구 사항에 따라 사용자 정의 객체를 특정 키/값 개체를 쿼리하고 구성하는 것이 훨씬 쉬울 것이다이 유틸리티와

const _get = require('lodash.get'); 

_get(obj, 'address.city'); // "San Jose" 

.

그렇지 않으면 당신은 당신의 자신의 안전 접근 기능을 만들 수 있습니다

function getKey(key, obj) { 
    return key.split('.').reduce(function(a,b){ 
    return a && a[b]; 
    }, obj); 
} 

getKey('address.city'', obj); // "San Jose" 
+0

안녕 덕분에. 나는 로다시에 대해 알고 있지만 특정 키의 데이터 만 얻고 싶습니다. 다른 키와 값을 제거하는 방법에 대해 설명 할 수 있습니다. – realcodes

-1

복잡한 데이터 쿼리를 수행하는 가장 쉬운 방법은 당신의 필요를 충족하기 위해 풍부한 충분한 쿼리 언어를 지원하는 데이터 스토리지 엔진에 의존하는 것입니다. Mongo, CouchbaseElasticsearch는 또 다른 접근 방식은 데이터 추출 파이프 라인을 구축 Lodash 또는 Ramda 같은 기능 라이브러리를 사용하는 것입니다.

내장 기능을 갖춘 쿼리 언어와 스토리지 엔진의 예입니다. 사용자가 제공 한 데이터 예로부터 추출 Lodash를 사용

:

const _ = require('lodash') 

// paths to extract from matching records 

const field_paths = [ 
    'name', 
    'username', 
    'address.city', 
    'address.geo.lat', 
    'address.geo.lng'] 

// extract value at field_paths and add to result 

const extract_fields = (rec) => { 
    let res = {} 
    field_paths.forEach((path) => { 
    res[path] = _.get(rec, path) 
    }) 
    return res 
} 

// query for all records where 
// name is like "*Graham*" irrespective of letter case. 
// 
// and extract required fields from matching records 

const results = _(data) 
    .filter((rec) => _.get(rec, 'name').match(/\bgraham\b/i)) 
    .map(extract_fields) 
    .value() 

console.log(results) 

인쇄됩니다 : 답변

[ { name: 'Leanne Graham', 
    username: 'Bret', 
    'address.city': 'Gwenborough', 
    'address.geo.lat': '-37.3159', 
    'address.geo.lng': '81.1496' }, 
    { name: 'Graham', 
    username: 'David', 
    'address.city': 'San Jose', 
    'address.geo.lat': '39.3159', 
    'address.geo.lng': '121.1496' } ] 
+0

그리고 단지 기록을 위해, 나는이 작업이 단일 로다시 체인으로 표현 될 수 있다는 것을 알고 있었지만 함수형 프로그래밍에 익숙하지 않은 사람들은 내 대답을 읽을 수 있어야한다고 생각했습니다. –

+1

나는 왜 OP의 우려 사항을 완전히 해결했는지 누군가가 내 대답을 왜곡하는지 궁금하다. –