2013-10-14 2 views
0

Я пишу код для сортировки столбцов в таблице. (Таблица привязана к данным через KnockOutJS). Чтобы помочь автоматизировать этот процесс в разных таблицах и страницах, я создал объект с именами столбцов и sortPropertyName объекта, к которому привязан столбец.Доступ к вложенным свойствам в JavaScript

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:

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; 
    }); 
}; 

(Полный Заслуга Райан Rahlf http://ryanrahlf.com/sorting-tables-by-column-header-with-knockout-js-part-2/)

Этот отлично работает для свойств, которые являются «корневыми» свойствами, такими как имя и идентификатор, однако у этого объекта есть другой объект, называемый «Адрес», который содержит такие данные, как Город и Штат, и т. д. Это нарушает функцию sort(), потому что я Неправильно указывается, как перейти к параметрам «город» и «состояние».

Например, для того, чтобы получить доступ к "Name" мы можем использовать 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

Brilliant. Спасибо. –

Смежные вопросы