更改按自定义属性排序的对象数组的顺序

Change order of array of objects sorted by custom property

本文关键字:对象 顺序 数组 排序 自定义属性      更新时间:2023-09-26

我正试图编写一个脚本来更改对象数组的顺序,该数组由order属性排序,以允许我在正在处理的对象数组中移动元素。

如果我有:

[
  {order: 0, name: 'a'},
  {order: 1, name: 'b'},
  {order: 2, name: 'c'}
]

我想给b order 0,函数的结果是:

[
  {order: 0, name: 'b'},
  {order: 1, name: 'a'},,
  {order: 2, name: 'c'}
]

其他示例:

// a to pos 2
input = [
  {order: 0, name: 'a'},
  {order: 1, name: 'b'},
  {order: 2, name: 'c'}
]
output = [
  {order: 2, name: 'a'},
  {order: 0, name: 'b'},
  {order: 1, name: 'c'}
]
// c to pos 1
input = [
  {order: 0, name: 'a'},
  {order: 1, name: 'b'},
  {order: 2, name: 'c'}
]
output = [
  {order: 0, name: 'a'},
  {order: 1, name: 'c'},
  {order: 2, name: 'b'}
]

到目前为止,这是我的脚本:

var movedColumn         = { order: 4, name: 'd' };
var newIndex            = 1;
var oldIndex            = movedColumn.order;
var columns             = [ { order: 0, name: 'a' }, { order: 1, name: 'b' }, { order: 2, name: 'c' }, { order: 3, name: 'd' }, { order: 4, name: 'e' }, { order: 5, name: 'f' } ];
columns.sort(function asc(a, b) { return a.order - b.order; }).forEach(function(column) {
  if (column.order >= newIndex && column.order < oldIndex) {
    column.order += 1;
  }
});
columns.find(function(column) {
  return column.name === movedColumn.name;
}).order = newIndex;

http://codepen.io/FezVrasta/pen/XXgxWe?editors=001

当我想将b移动到order 0时,它工作得很好,但如果我想将a移动到order 1,它就不工作了
我不在乎数组中对象的顺序,在我的脚本中,我对它们进行排序只是为了"漂亮地打印"结果并保持清晰
重要的是order属性的值。

我该怎么修?

简短版本

我需要取一个对象并将其移动到newIndex定义的位置,移动所有元素以防止碰撞(两个不同对象的顺序相同)

这可能是一个解决方案:

var movedColumn         = { order: 5, name: 'f' };
var newIndex            = 4;
var oldIndex            = movedColumn.order;
var columns             = [ { order: 0, name: 'a' }, { order: 1, name: 'b' }, { order: 2, name: 'c' }, { order: 3, name: 'd' }, { order: 4, name: 'e' }, { order: 5, name: 'f' } ];
columns.sort(function asc(a, b) { return a.order - b.order; }).forEach(function(column) {
  if (newIndex < oldIndex) {
    if (column.order >= newIndex && column.order < oldIndex) {
      column.order += 1;
    }
  }
  if (newIndex > oldIndex) {
    if (column.order > oldIndex && column.order <= newIndex) {
      column.order -= 1;
    }
  }
});
columns.find(function(column) {
  return column.name === movedColumn.name;
}).order = newIndex;

它似乎是双向的,看到它不太好,但它确实起到了作用。

从逻辑上讲,如果你试图将元素移动到相同的顺序,它将不会起任何作用。