对可观察数组进行排序,其中0始终为最后一个(对于升序和降序排序)

时间:2017-05-22 12:58:45

标签: javascript knockout.js

我有一个可观察的对象数组,用于填充具有可排序列的表。

我的排序功能完美无缺,基于以下简化:

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

2 个答案:

答案 0 :(得分:2)

我认为如果Show为零,您只需要返回1 - 请参阅下面的更新脚本<​​/ p>

&#13;
&#13;
l
&#13;
&#13;
&#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>