2013-10-14 3 views
0

테이블에 열을 정렬하는 코드를 작성 중입니다. (테이블은 KnockOutJS를 통해 데이터에 바인딩됩니다.) 다른 테이블과 페이지에서이 프로세스를 자동화하는 데 도움이되도록 열 이름이있는 개체와 열이 바인딩 된 개체의 sortPropertyName을 만들었습니다.JavaScript에서 중첩 된 속성에 액세스

self.sort = function (header, event) { 
    var prop = header.sortPropertyName; 
    self.people.sort(function (a, b) { 
     return a[prop] < b[prop] ? -1 : a[prop] > b[prop] ? 1 : a[prop] == b[prop] ? 0 : 0; 
    }); 
}; 

이 (전체 신용 http://ryanrahlf.com/sorting-tables-by-column-header-with-knockout-js-part-2/을 라이언 Rahlf로 이동) :

self.headers = [ 
    { title: 'ID', sortPropertyName: 'organizationId' }, 
    { title: 'Name', sortPropertyName: 'name' }, 
    { title: 'City', sortPropertyName: '[address].city' }, 
    { title: 'State', sortPropertyName: '[address].state' }, 
    { title: 'Phone Number', sortPropertyName: 'phone' } 
]; 

그 종류의 속성은 단지되며 sortProperty을 기준으로 데이터를 정렬해야하는, 일종의 루틴에 전달 이름 및 ID와 같은 "루트"속성 인 속성에 대해서는 잘 작동하지만 City 및 State 등의 정보가 들어있는 "Address"라는 다른 객체가 있습니다.이 때문에 sort() 함수가 깨졌습니다 방법을 정확하게 지정하지 않았습니다. "city"및 "state"매개 변수를 가져옵니다.

예를 들어, 액세스하기 위해 "이름"우리는 person.name 또는 사람 [ '이름']를 사용할 수 있습니다. 그러나 주소의 경우에는 상황이 좀 더 복잡해집니다. person.address.city 또는 사람 [ '주소'] 도시 또는 사람 [ '주소'] [ '도시']을 사용할 수 있습니다.

그러나 형식의 어떠한 조합 내가 종류() 함수에 전달하는 sortPropertyName에 관해서 저를 위해 일하게 될 것 같다. "이름"은 잘 작동하지만 "도시"와 "주"는 그렇지 않습니다.

모든 것이 예상대로 작동하도록 코드를 수정하려면 어떻게해야합니까?

답변

2

당신은 중첩 된 소품에 액세스하기 위해이 같은 것을 사용할 수 있습니다

function ref(obj, str) { 
    return str.split(".").reduce(function(o, x) { return o[x] }, obj); 
} 

다음

cmp = function(a, b) { return a > b ? 1 : a < b ? -1 : 0 } 

self.people.sort(function (a, b) { 
    return cmp(ref(a, "address.city"), ref(b, "address.city")) 
} 
+0

브릴리언트합니다. 고맙습니다. –

관련 문제