Knockout.js排序列表

sim*_*ple 5 javascript jquery knockout.js

我有一个排序列表使用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>
Run Code Online (Sandbox Code Playgroud)

ber*_*ert 7

this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;}));
Run Code Online (Sandbox Code Playgroud)

  • SO 上普遍接受的是,您解释代码示例而不仅仅是提供复制和粘贴答案。这有助于将来到达这里寻找有关此主题的更多信息的用户。 (2认同)

Now*_*ess 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;}));
    };
};
Run Code Online (Sandbox Code Playgroud)

行解释:weWiliChangeTheArrayToValue(weWilSortTheArrayWithASpecialFunction(ComparatorFunction))

ComparatorFunction即.

function(a, b) { return a.name < b.name;} 
Run Code Online (Sandbox Code Playgroud)

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

编辑还有一件事:如果比较非ASCII字符,请使用return a.localCompare(b); (并返回b.localCompare(a);)并且当处理数字时使用" - "唱,所以这是一个算术运算

EDIT2
警告上面的方法">"可能会破坏数组使用中的重复项

return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

相反(或只是localCompare)