2014-02-06 5 views
21

와 findWhere 어떻게 아래 필터링 가야합니까 :Underscore.js : 중첩 된 속성 값

[{ 
    "id": 100, 
    "title": "Tlt1", 
    "tax": [{ 
     "name": "Tax1", 
     "id": 15 
    }, { 
     "name": "Tax1", 
     "id": 17 
    }] 
}, { 
    "id": 101, 
    "title": "Tlt2", 
    "tax": [{ 
     "name": "Tax2", 
     "id": 16 
    }] 
}, { 
    "id": 102, 
    "title": "Tlt3", 
    "tax": [{ 
     "name": "Tax3", 
     "id": 17 
    }, { 
     "name": "Tax3", 
     "id": 18 
    }] 
}] 

얻을 수있는 유일한 tax.id 아래에 따라, 17입니다 그 :

[ 
    { 
     "id": 100, 
     "title": "Tlt1", 
     "tax": [ 
      { 
       "name": "Tax1", 
       "id": 15 
      }, 
      { 
       "name": "Tax1", 
       "id": 17 
      } 
     ] 
    }, 
    { 
     "id": 102, 
     "title": "Tlt3", 
     "tax": [ 
      { 
       "name": "Tax3", 
       "id": 17 
      }, 
      { 
       "name": "Tax3", 
       "id": 18 
      } 
     ] 
    } 
] 

현재 I 아래의 방법을 사용하십시오. 그러나 이것에 대해 더 명확한 방법이있을 수 있습니까? 여기

var arr = []; 
_(data).each(function (v1, k1) { 
    _(v1.tax).each(function (v2, k2) { 
     if (v2.id == id) { 
      arr.push(v1); 
     } 
    }); 
}); 

데모 : 어떤 제안이 많이 감사 http://jsfiddle.net/7gcCz/2/

. http://jsfiddle.net/hCVxp/

업데이트 @GruffBunny에


감사 :

+0

이 CR의 후보가 될 수 ... –

답변

42

당신은 _.filter의 조합 _.where

_.filter(data, function(obj) { 
    return _.where(obj.tax, {id: ID_TO_FIND}).length > 0; 
}) 

참조 데모를 사용할 수 있습니다. 보다 효율적인 방법은 모든 tax 항목을 통해 루핑 방지하기 위해 _.some을 사용하는 것입니다

var arr = _.filter(data, function(obj) { 
    return _.some(obj.tax, {id: ID_TO_FIND}); 
}); 

참조 데모 :의 존재를 확인하기 위해 후보 항목과 _.some을 찾을 http://jsbin.com/putefarade/1/edit?html,js,console

+5

주먹 시간 '사용 underscore', 먼저 Roadbump, 구글 첫 링크, FTW! – MattSizzle

+1

또한 세금이 단지 객체 일 경우,이 세금을 배열에 올려 놓아야합니다. 이 같은 것 _.some ([obj.tax], {id : ID_TO_FIND}); –

17

사용 _.filter 컬렉션의 항목 :

var filteredList = _.filter(list, function(item){ 
    return _.some(item.tax, { id: 17 }); 
}); 
+0

이 대답은 위의 허용 된 대답보다 더 효과적이라고 생각합니다. –

+0

필터 내부에서 _.findWhere를 사용할 수 있습니까? – Jain

3

이 작업은 _.where에서만 수행 할 수 있습니다.

var filteredList = _.where(list, { tax:[{id:17}] }); 

편집 :이 방법은 이전 버전의 lodash에서 작동하지만 현재 밑줄이나 lodash에서는 작동하지 않습니다. 어쨌든 예 작업 : https://jsfiddle.net/rhp4crma/

+0

누군가 왜 이것이 downvoted되고 말해 줄 수 있습니까? 나는 그것을 테스트하고 오직 1 명령만으로 OP가 요구 한 정확한 결과를 리턴한다. – Gray

+0

나는 이것을 시도하고 그것은 작동하지 않습니다. 내 항목은 항목이 있지만 정의되지 않은 상태로 반환됩니다. – tno2007

+1

올바른 구문은 다음과 같습니다. var filteredList = _.where (list, {tax : {id : 17}})); – Sam