我正在尝试编写一个脚本来更改对象数组的顺序,按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
定义的位置,移动所有元素以防止碰撞(两个不同物体上的顺序相同)
答案 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;
它似乎在两个方向都有效,看起来并不好看,但是它确实起作用了。
逻辑上,如果您尝试将元素移动到完全相同的顺序,它将无效。