5

我有一个使用 knockout.js 的排序列表作为选择列表。我想将其转换为无序列表。用 knockout.js 对列表进行排序的方法是什么?我认为错误在于: allItems().length > 1

http://jsfiddle.net/infatti/Ky5DK/

var BetterListModel = function () {
    this.allItems = ko.observableArray([
        { name: 'Denise' },
        { name: 'Charles' },
        { name: 'Bert' }
    ]); // Initial items

    this.sortItems = function() {
        this.allItems.sort();
    };
};

ko.applyBindings(new BetterListModel());


<button data-bind="click: sortItems, enable: allItems().length > 1">Sort</button>
4

2 回答 2

7
this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;}));
于 2013-05-24T21:55:02.903 回答
7
var BetterListModel = function () {
    this.allItems = ko.observableArray([
    { name: 'Denise' },
    { name: 'Charles' },
    { name: 'Bert' }
    ]); // Initial items

    this.sortItemsAscending = function() {
        this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;}));
    };

    this.sortItemsDescending = function() {
        this.allItems(this.allItems().sort(function(a, b) { return a.name < b.name;}));
    };
};

行解释:weWiliChangeTheArrayToValue(weWilSortTheArrayWithASpecialFunction(ComparatorFunction))

ComparatorFunction 即。

function(a, b) { return a.name < b.name;} 

是一个特殊的函数,它可以帮助 sort 函数……很好地排序。
它需要 2 个参数并比较它们,如果第一个参数“更大”(应该在列表中更远),则返回 true;如果第一个参数“更小”,则返回 false
每个(几乎)排序算法通过比较已排序集合的 2 个元素来工作,直到一切都井井有条。
更改顺序是通过确保函数在正常返回 true 时返回 false 来完成的 - 最简单的方法是将 > 操作更改为 <

编辑另一件事:如果您比较非 ASCII 字符,请使用 return a.localCompare(b); (并返回 b.localCompare(a);)并且在处理数字时使用“-” sing 所以这是一个算术运算

EDIT2
警告上述方法“>”可能会因数组使用中的重复而中断

return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;

相反(或只是localCompare)

于 2013-07-18T14:23:56.730 回答