任意重新排序和排序对象文字的javascript数组

时间:2013-09-12 14:02:26

标签: javascript json algorithm

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

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

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

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

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

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

    reorder(myObject, newOrder);
    
    1. 循环到订单数组
    2. 找到匹配的对象时:
    3. 如果新订单少于开始订单
    4. 新订单和开始订单之间对象的增量订单属性
    5. 如果新订单大于启动订单
    6. 减少开始订单与新订单之间的订单属性
    7. 如果新订单与旧订单相同,则不执行任何操作
    8. 在匹配对象上设置新订单
    9. 排序()
    10. 实用程序方法“sort()”使用本机javascript sort()函数来确保数组始终由“order”属性排序。这很好,但是有一些更有效/雄练的解决方案。

      提前致谢。

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

  1. myObject.order设置为newOrder(其中newOrder是目标位置的订单之间的某个数字)。 E.g -1向前移动,或1.5#1#2之间移动
  2. 使用自定义排序()
  3. 遍历toOrder数组,并将每个项目的order设置为其索引(以便它再次变为整数或增加/减少以匹配新位置)