在JavaScript中访问嵌套属性

时间:2013-10-14 20:09:56

标签: javascript knockout.js

我正在编写一些代码来对表中的列进行排序。 (该表通过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属性传递给排序例程,然后根据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/

这适用于属于“root”属性的属性,例如Name和ID,但是此对象有另一个名为“Address”的对象,其中包含City和State等信息。这打破了排序( )函数,因为我没有正确指定如何获得“城市”和“状态”参数。

例如,要访问“姓名”,我们可以使用 person.name person ['name'] 。然而,在地址的情况下,事情会变得复杂一些。我们可以使用 person.address.city person ['address']。city 甚至 person ['address'] ['city']

然而,对于我传递给 sort()函数的 sortPropertyName ,似乎没有格式组合。 “名称”工作正常,但“城市”和“州”没有。

如何修改我的代码,以便一切按预期工作?

1 个答案:

答案 0 :(得分: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"))
}