[英]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.