1

大家,早安!今天早上我正在解决一个问题,考虑到我在下面制定的要求,需要重新排序以下 javascript 数组:

编辑:我意识到“重新排序”和“排序”有时可以互换使用。但是在这种情况下,我将“重新排序”称为更改“顺序”属性,以便所有对象都具有唯一的顺序。排序只是指根据 order 属性保持数组升序。

var toOrder = [
  {
    order: 1,
    visible: true
  },
  {
    order: 2,
    visible: true
  }
]
  1. 客户端代码必须能够重新排序这个数组,给定一个接受对象的函数和一个新的顺序。

  2. 数组必须始终按升序(按 order 属性)排序

  3. 没有两个对象可以有相同的顺序

我写了一些代码来完成工作,但我正在寻找一个更有说服力的解决方案。我当前的重新排序算法(在伪代码中)如下所示:

reorder(myObject, newOrder);
  1. 循环 toOrder 数组
  2. 当找到匹配的对象时:
  3. 如果新订单少于起始订单
  4. 在新订单和起始订单之间增加对象的订单属性
  5. 如果新订单大于起始订单
  6. 开始订单和新订单之间的递减订单属性
  7. 如果新订单与旧订单相同,则什么也不做
  8. 在匹配的对象上设置新订单
  9. 种类()

实用方法“sort()”使用原生 javascript sort() 函数来确保数组始终按“order”属性排序。这很好用,但是有一些更有效/更有说服力的解决方案。

提前致谢。

4

2 回答 2

4

你的措辞有点混乱,但我是这样解释的:

你有一个对象数组,每个对象都有一个 order 属性。此订单属性必须是唯一的。您希望获取对象 A 并将其放置在新位置,然后重新应用订单属性,使它们是唯一且连续的。

这是我的做法:

function reorder(object, newIndex) {

    var oldIndex = toOrder.indexOf(object);
    toOrder.splice(oldIndex, 1);
    toOrder.splice(newIndex, 0, object);

    // If you can guarantee your order properties were already indexed,
    // this loop could instead be
    // for (var i = Math.min(oldIndex, newIndex); i <= Math.max(oldIndex, newIndex); ++i)
    for (var i = 0; i < toOrder.length; ++i) {
        toOrder[i].order = i;
    }
}
于 2013-09-12T14:38:17.393 回答
0

更简单的解决方案(仍然适用于任意order值,不仅newOrder是实际数组索引在哪里):

  1. 设置myObject.ordernewOrder(其中 newOrder 是目标位置的订单之间的某个数字)。例如-1在前面移动,或在和1.5之间移动#1#2
  2. 使用自定义 sort()
  3. 循环遍历toOrder数组并将order每个项目的索引设置为它的索引(使其再次变为整数或增加/减少以匹配新位置)
于 2013-09-12T14:38:27.113 回答