【问题标题】:Accessing nested properties in JavaScript访问 JavaScript 中的嵌套属性
【发布时间】:2013-10-15 04:14:20
【问题描述】:

我正在编写一些代码来对表中的列进行排序。 (该表通过 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,但是该对象有另一个名为“地址”的对象,其中包含诸如城市和州等信息。这破坏了排序( ) 函数,因为我没有正确指定如何获取“城市”和“州”参数。

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

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

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

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了。谢谢。
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2018-07-14
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多