更改按自定义属性排序的对象数组的顺序
Change order of array of objects sorted by custom property
我正试图编写一个脚本来更改对象数组的顺序,该数组由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;
它似乎是双向的,看到它不太好,但它确实起到了作用。
从逻辑上讲,如果你试图将元素移动到相同的顺序,它将不会起任何作用。
相关文章:
- Javascript-根据赋值顺序,按键合并对象数组
- 如何按对象反转Angular ngRepeat的顺序's键,这些键是数字键
- 按特定顺序对对象进行排序—Angular
- 如何在 JavaScript 中以递增顺序在对象中添加属性
- JavaScript:指定对象中属性的顺序
- 对象的顺序已更改
- Javascript对象多个循环,相同的顺序
- 如何使用下划线根据自定义排序顺序对对象数组进行排序
- 对象在循环中运行时未定义,但在按顺序执行时未定义
- AngularJS-ngRepeat对对象的返回顺序与vanillar.in循环不同
- ng重复javascript对象中未按预期顺序重复的项
- 如何像java脚本中给定的对象一样,将对象的属性保持在相同的顺序
- javascript:按实际顺序获取对象项
- 在JavaScript中,对象如何跟踪键/值的插入顺序
- 如何根据不同排序顺序的多个值对json对象进行排序
- three.js:透明对象根据相机角度按错误顺序渲染
- 按数组顺序排列对象
- 通过多次调用按顺序将对象插入数组
- jQuery - 本地存储排序字符串化对象顺序
- 重置对象顺序