我有一个可观察的对象数组,用于填充具有可排序列的表。
我的排序功能完美无缺,基于以下简化:
self.sortTheItems = function () {
self.items.sort(function (l, r) {
var rslt = l === r ? 0 : l < r ? -1 : 1;
return self.sortAscending() ? rslt : -rslt;
});
}
如何将此更改为始终将0 最后的值放在升序和降序排序中?
e.g。未排序的值:3,1,2,2,0,1,3,0
降序:3,3,2,2,1,1,0,0
升序:1,1,2,2,3,3,0,0
答案 0 :(得分:2)
我认为如果Show
为零,您只需要返回1 - 请参阅下面的更新脚本</ p>
l
&#13;
答案 1 :(得分:1)
我认为主要问题是,排序一个值总是持续的,在堆栈溢出之前已经多次回答。 (example)
为了让事情变得更有趣,你可能想要探索一下knockoutjs可以带来什么。
包含computed
排序方法和computed
排序项数组可能会很好,因此一个复选框在两个方法之间交换:
// Wraps a sort method in a pre-check
const sortZeroesLast = sorter => (a, b) => {
// Check both for `0`
if (a === 0) return 1;
if (b === 0) return -1;
// If none is `0`, we can use our regular sorter
return sorter(a, b);
};
// Regular sort methods
const sortAscending = (a, b) => (a > b ? 1 : a < b ? -1 : 0);
const sortDescending = (a, b) => (a < b ? 1 : a > b ? -1 : 0);
const VM = function() {
this.items = ko.observableArray([3, 1, 1, 0, 2, 1, 5]);
// Determine which sort function to use based on `ascending` setting
this.ascending = ko.observable(false);
const sorter = ko.pureComputed(() =>
sortZeroesLast(this.ascending() ? sortAscending : sortDescending)
);
// Create a computed that updates when the items
// change, or the ascending direction
this.sortedItems = ko.pureComputed(() => this.items().sort(sorter()));
this.input = ko.observable(0);
this.addInput = () => {
this.items.push(parseFloat(this.input() || 0));
};
};
ko.applyBindings(new VM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<label>
<input type="checkbox" data-bind="checked: ascending">
Ascending
</label>
<ul data-bind="foreach: sortedItems">
<li data-bind="text: $data"></li>
</ul>
<input type="number" data-bind="value: input"><button data-bind="click: addInput">add</button>