2012-05-23 5 views
2

저는 jQuery와 underscore.js을 사용하고 있습니다. 나는 title1-2이며 이에 해당하는 조치를 취하고 싶습니다.이 데이터를 얻는 더 좋은 방법이 있습니까?

var item = _.find(_.flatten(_.pluck(this.items.menuItems, 'data')), function (item) { return item.title === 'title1-2'; }); 
console.log(item.action); 

을 찾을 수있는 더 좋은 방법이 :

this.items = { 
    menuItems: [ 
     { title: 'title1', 
      data: [ 
       { title: 'title1-1', 
        action: 'action1-1' 
       }, 
       { title: 'title1-2', 
        action: 'action1-2' 
       } 
       ] 
     }, 
     { title: 'title2', 
      data: [ 
       { title: 'title2-1', 
        action: 'action2-1' 
       }, 
       { title: 'title2-2', 
        action: 'action2-2' 
       } 
      ] 
     } 
    ] 
}; 

현재, 나는이 작업을 수행하려면 다음과 같은 코드가?

+1

그것은 나에게 상당히 좋게 보입니다. 그러나이 질문은 codereview.stackexchange.com에 더 적합 할 수 있습니다 –

+0

당신의 질문은 무엇입니까? – Sangeeta

답변

0

개체의 크기가 커짐에 따라 영리한 접근이 가능하지만 효율적이지는 않습니다 (하위 배열의 여러 조작). 나는 두 개의 밑줄을 쓰는게 더 나을 것이라고 생각한다 .js는 다음을 찾는다. menuitem에 일치하는 titlex가 있고 데이터 titlex-y와 일치한다.

var item = _.find(
    _.find(
     this.items.menuItems, function(item) { 
      return item.title === 'title1' 
     }).data, 
    function(item) { 
     return item.title = 'title1-2' 
    }); 
2

_.chain로 전환하는 것은 좀 더 쉽게 이해할 수 있도록 다음과 같습니다

var item = _.chain(items.menuItems) 
      .pluck('data') 
      .flatten() 
      .find(function(i) { return i.title === 'title1-2' }) 
      .value(); 

데모 : http://jsfiddle.net/ambiguous/mPa3m/

당신은 또한 pluckflatten을 건너 뛸 수있는 findmap 돌며 사용하여 :

var right_title = function(i) { return i.title === 'title1-2' }; 
var is_there = function(i) { return i }; 
var item  = _.chain(items.menuItems) 
        .map(function(i) { return _(i.data).find(right_title) }) 
        .find(is_there) 
        .value(); 

데모 : http://jsfiddle.net/ambiguous/uRBuZ/

하거나 오래된 학교를 가서 단락 중첩 루프를 사용

var i, j, sub, item; 
for(i = 0, item = null; !item && i < items.menuItems.length; ++i) 
    for(j = 0, sub = items.menuItems[i]; !item && j < sub.data.length; ++j) 
     if(sub.data[j].title === 'title2-1') 
      item = sub.data[j]; 

데모 : http://jsfiddle.net/ambiguous/7xt5D/

이 하나의 복사본 만 참조 몇 쉽게해야하므로 메모리에 저장되고 첫 번째 가능한 기회에서 멈추어 적절하게 게으르다.

var idx = { }; 
var i, j, sub, item; 
for(i = 0, item = null; !item && i < items.menuItems.length; ++i) 
    for(j = 0, sub = items.menuItems[i]; !item && j < sub.data.length; ++j) 
     idx[sub.data[j].title] = sub.data[j]; 
console.log(idx['title1-2']); 

데모 : http://jsfiddle.net/ambiguous/SJuHp/

은 위의 제목 있다고 가정

당신은 당신이 제목으로 직접 액세스 할 수 있도록 인덱스를 구축하기 적합 할 수 있습니다이 많은 일을하는 경우 는 고유하지만, 문제가있는 경우 idx의 배열로 쉽게 전환 할 수 있습니다. this.items에 대한 변경 사항을 idx에 추적해야하지만, 모든 변경 사항을 오브젝트 내부에 숨기고 해당 오브젝트의 메소드를 통해서만 데이터를 처리하면 쉽습니다.

+0

각 솔루션마다 1을 upvote 할 수 있으면 좋겠다. :-) – Bergi

관련 문제