更改按自定义属性

时间:2016-01-12 14:13:38

标签: javascript arrays object

我正在尝试编写一个脚本来更改对象数组的顺序,按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定义的位置,移动所有元素以防止碰撞(两个不同物体上的顺序相同)

1 个答案:

答案 0 :(得分:1)

可能这是一个解决方案:

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;

它似乎在两个方向都有效,看起来并不好看,但是它确实起作用了。

逻辑上,如果您尝试将元素移动到完全相同的顺序,它将无效。