更改排序顺序时更新键值的最短方法是什么

artsmc

我有一个对象数组,其键名为order,如下所示:

[{id:"24fin1st",ruler:false,order:1}, {id:"24fin2nd",ruler:false,order:2}, {id:"24fin3rd",ruler:false,order:3}, {id:"24fin4th",ruler:false,order:4}]

假设我们将项目4移至项目2。或第1项到第4项。更新整个关键订单列表的最有效方法是什么。我在想从原点到目的地获取整个数组,然后在该范围内对键进行重新编号,例如:

var switchUp = [{
  id: "24fin1st",
  ruler: false,
  order: 1
}, {
  id: "24fin2nd",
  ruler: false,
  order: 2
}, {
  id: "24fin3rd",
  ruler: false,
  order: 3
}, {
  id: "24fin4th",
  ruler: false,
  order: 4
}];

function sortNumber(a, b) {
  return a - b;
}

function resort(org, des, arr) {
  var move;
  if (org > des) {
    move = "up";
    var range = arr.slice(des - 1, org)
  } else {
    move = "down";
    var range = arr.slice(org - 1, des)
  }
  range.forEach(function(su, i) {
    if (su.order === org) {
      su.order = des;
    } else {
      if (move === "up") {
        su.order = su.order + 1;
      } else {
        su.order = su.order - 1
      }
    }

  })
}

resort(1, 3, switchUp);
switchUp.sort(function(a, b) {
  return parseFloat(a.order) - parseFloat(b.order);
});
console.log(switchUp)

我认为这种方式很不错,但是不确定是否最快。

亭子

sort应用在结束-你交换两个节点的订单价值后-可能需要O(nlogn)的时间,而这可能在做O(n)的两个调用splice和重编循环:

var switchUp = [{
  id: "24fin1st",
  ruler: false,
  order: 1
}, {
  id: "24fin2nd",
  ruler: false,
  order: 2
}, {
  id: "24fin3rd",
  ruler: false,
  order: 3
}, {
  id: "24fin4th",
  ruler: false,
  order: 4
}];

function resort(org, des, arr) {
  var first = Math.min(org, des) - 1,
      last = Math.max(org, des) - 1;
  arr.splice(des-1,0,arr.splice(org-1, 1)[0]);
  for (var i = first; i <= last; i++) {
    arr[i].order = i + 1;
  }
}

resort(3, 1, switchUp);

console.log(switchUp);

请注意,这splice将更改突变点之后所有元素的索引,并且在第二次调用时再次发生这种情况,这将恢复真正需要更改的范围右侧的元素的原始索引。尽管splice可能非常有效地执行其任务(因为它是一种内部方法),但显式地逐个移动范围内的元素可能会更有效(在非常大的数组上):

var switchUp = [{
  id: "24fin1st",
  ruler: false,
  order: 1
}, {
  id: "24fin2nd",
  ruler: false,
  order: 2
}, {
  id: "24fin3rd",
  ruler: false,
  order: 3
}, {
  id: "24fin4th",
  ruler: false,
  order: 4
}];

function resort(org, des, arr) {
  var node = arr[org-1],
      inc = org < des ? 1 : -1;
  for (var i = org-1; i !== des-1; i+=inc) {
       arr[i] = arr[i+inc];
       arr[i].order = i + 1;
  }
  node.order = des;
  arr[des-1] = node;
}

resort(3, 1, switchUp);

console.log(switchUp);

最后要注意的是:您的函数期望索引基于1,就像order值一样。但是,由于JavaScript使用基于0的索引,因此对于使用您的代码的人来说,这可能会很直观。在标准数组函数slice希望将基于0的索引作为参数的情况下,此自定义函数希望使用基于1的索引。如果您重新考虑此选择并使用基于0的索引,那将是一件好事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

排序的默认顺序是什么?

来自分类Dev

排序时更改排序顺序是不确定的行为吗?

来自分类Dev

更改ArrayList中元素顺序的最快方法是什么?

来自分类Dev

按键值顺序排序

来自分类Dev

按键值顺序排序

来自分类Dev

从脚本调用目录更改到目录的最安全(或最优雅或最短)方法是什么?

来自分类Dev

Linux排序的默认顺序是什么?

来自分类Dev

对元组列表进行排序时的默认行为是什么?

来自分类Dev

排序时的正确语法是什么?1004 错误

来自分类Dev

二维数组的逐列顺序排序的最佳方法是什么?

来自分类Dev

将列的值按特定顺序排序的最有效方法是什么?

来自分类Dev

在对模型进行排序时更新QTableView / QHeaderView中的排序顺序指示器

来自分类Dev

列表排序方法不更新顺序

来自分类Dev

没有明确定义的顺序时,默认顺序是什么?

来自分类Dev

没有明确定义的顺序时,默认顺序是什么?

来自分类Dev

在Windows 7中结束多进程的最短方法是什么

来自分类Dev

临时绕过zsh中的功能的最短方法是什么?

来自分类Dev

通过引用重新填充数组的最短方法是什么?

来自分类Dev

检测变量中最大值的最短方法是什么?

来自分类Dev

UITableViewController的加载方法的逻辑顺序是什么?

来自分类Dev

在JSON模式中定义键值对的正确方法是什么

来自分类Dev

绘制Redis(键值)数据结构的标准方法是什么?

来自分类Dev

当我更改xmlnode的顺序时,ServiceStack.Text.XmlSerializer.DeserializeFromString结果更改。为什么?

来自分类Dev

实现堆排序的正确方法是什么?

来自分类Dev

为什么更新字典不按相同顺序排序

来自分类Dev

应用按名称排序时顺序错误

来自分类Dev

Oracle查询中最好的方法是什么,以避免更新字段(如果未更改)?

来自分类Dev

当路由参数更改时,将更新的输入传播到子组件的正确方法是什么

来自分类Dev

在命令行上,排序时“通用”和“字符串”数字值是什么?

Related 相关文章

  1. 1

    排序的默认顺序是什么?

  2. 2

    排序时更改排序顺序是不确定的行为吗?

  3. 3

    更改ArrayList中元素顺序的最快方法是什么?

  4. 4

    按键值顺序排序

  5. 5

    按键值顺序排序

  6. 6

    从脚本调用目录更改到目录的最安全(或最优雅或最短)方法是什么?

  7. 7

    Linux排序的默认顺序是什么?

  8. 8

    对元组列表进行排序时的默认行为是什么?

  9. 9

    排序时的正确语法是什么?1004 错误

  10. 10

    二维数组的逐列顺序排序的最佳方法是什么?

  11. 11

    将列的值按特定顺序排序的最有效方法是什么?

  12. 12

    在对模型进行排序时更新QTableView / QHeaderView中的排序顺序指示器

  13. 13

    列表排序方法不更新顺序

  14. 14

    没有明确定义的顺序时,默认顺序是什么?

  15. 15

    没有明确定义的顺序时,默认顺序是什么?

  16. 16

    在Windows 7中结束多进程的最短方法是什么

  17. 17

    临时绕过zsh中的功能的最短方法是什么?

  18. 18

    通过引用重新填充数组的最短方法是什么?

  19. 19

    检测变量中最大值的最短方法是什么?

  20. 20

    UITableViewController的加载方法的逻辑顺序是什么?

  21. 21

    在JSON模式中定义键值对的正确方法是什么

  22. 22

    绘制Redis(键值)数据结构的标准方法是什么?

  23. 23

    当我更改xmlnode的顺序时,ServiceStack.Text.XmlSerializer.DeserializeFromString结果更改。为什么?

  24. 24

    实现堆排序的正确方法是什么?

  25. 25

    为什么更新字典不按相同顺序排序

  26. 26

    应用按名称排序时顺序错误

  27. 27

    Oracle查询中最好的方法是什么,以避免更新字段(如果未更改)?

  28. 28

    当路由参数更改时,将更新的输入传播到子组件的正确方法是什么

  29. 29

    在命令行上,排序时“通用”和“字符串”数字值是什么?

热门标签

归档