0

我正在编写一些代码来对表中的列进行排序。(该表通过 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' }
];

该排序属性被传递给排序例程,然后它应该根据 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/

这适用于“根”属性的属性,例如名称和 ID,但是该对象有另一个名为“地址”的对象,其中包含城市和州等信息。这破坏了 sort() 函数,因为我没有正确指定如何获取“城市”和“州”参数。

例如,为了访问“名称”,我们可以使用person.nameperson['name']。然而,在地址的情况下,事情变得有点复杂。我们可以使用person.address.cityperson['address'].city甚至person['address']['city']

然而,就我传递给sort()函数的sortPropertyName而言,似乎没有任何格式组合对我有用。“名称”可以正常工作,但“城市”和“州”不能。

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

4

1 回答 1

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"))
}
于 2013-10-14T20:14:20.460 回答