访问 JavaScript 中的嵌套属性

Accessing nested properties in JavaScript

本文关键字:嵌套 属性 JavaScript 访问      更新时间:2023-09-26

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

该排序属性被传递给排序例程,然后排序例程应仅根据 sortTProperty 对数据进行排序:

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.name人['名称']。然而,在地址的情况下,事情变得有点复杂。我们可以使用person.address.city或person['address'].city,甚至是person['address']['city']。

但是,对于

我传递给 sort() 函数的 sortPropertyName 而言,似乎没有格式组合对我有用。"名称"工作正常,但"城市"和"州"则不行。

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

你可以使用这样的东西来访问嵌套的 props:

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