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' }
];

その並べ替えプロパティが並べ替えルーチンに渡され、並べ替えプロパティに基づいてデータが並べ替えられます。

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 などの「ルート」プロパティであるプロパティでは問題なく機能しますが、このオブジェクトには、City や State などの情報を含む「Address」という別のオブジェクトがあります。 "city" および "state" パラメーターに到達する方法を正しく指定していません。

たとえば、「名前」にアクセスするには、person.nameまたはperson['name']を使用できます。ただし、アドレスの場合は、もう少し複雑になります。person.address.cityまたはperson['address'].cityまたはperson['address']['city']を使用できます。

ただし、 sort()関数に渡すsortPropertyNameに関しては、フォーマットの組み合わせが機能していないようです。「名前」は正常に機能しますが、「都市」と「州」は機能しません。

すべてが期待どおりに機能するようにコードを変更するにはどうすればよいですか?

4

1 に答える 1