[英]Accessing nested properties in JavaScript
我正在編寫一些代碼來對表中的列進行排序。 (該表通過KnockOutJS綁定到數據)。 為了幫助在不同的表和頁面中自動執行此過程,我創建了一個具有列名的對象,以及列所綁定的對象的sortPropertyName。
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' }
];
那個sort屬性被傳遞給一個sort例程,然后它應該只根據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;
});
};
(完全歸功於Ryan Rahlf http://ryanrahlf.com/sorting-tables-by-column-header-with-knockout-js-part-2/ )
這適用於屬於“根”屬性的屬性,例如Name和ID,但是此對象有另一個名為“Address”的對象,其中包含City和State等信息。這打破了sort()函數,因為我沒有正確指定如何獲得“城市”和“州”參數。
例如,為了訪問“名稱”,我們可以使用person.name或person ['name'] 。 然而,在地址的情況下,事情會變得復雜一些。 我們可以使用person.address.city或person ['address']。city甚至person ['address'] ['city'] 。
但是,對於我傳遞給sort()函數的sortPropertyName ,沒有格式組合似乎對我有用。 “名稱”工作正常,但“城市”和“州”沒有。
如何修改我的代碼,以便一切按預期工作?
你可以使用這樣的東西來訪問嵌套的道具:
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"))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.