编辑:我意识到“重新排序”和“排序”有时可以互换使用。但在这种情况下,我将'重新排序'称为更改'order'属性,以便所有对象都具有唯一的顺序。排序只是指根据订单属性按升序保持数组。
var toOrder = [
{
order: 1,
visible: true
},
{
order: 2,
visible: true
}
]
客户端代码必须能够重新排序此数组,给定一个获取对象和新订单的函数。
数组必须始终按升序排序(按订单属性排序)
没有两个对象可以具有相同的顺序
我写了一些代码来完成工作,但我正在寻找一个更有说服力的解决方案。我目前的重新排序算法(在psudocode中)如下所示:
reorder(myObject, newOrder);
实用程序方法“sort()”使用本机javascript sort()函数来确保数组始终由“order”属性排序。这很好,但是有一些更有效/雄练的解决方案。
提前致谢。
答案 0 :(得分:4)
你的措辞有点令人困惑,但这就是我解释它的方式:
您有一个对象数组,每个对象都有一个order属性。此订单属性必须是唯一的。 您希望获取对象A并将其置于新位置,然后重新应用订单属性,使其具有唯一性和顺序性。
我将如何做到这一点:
function reorder(object, newIndex) {
var oldIndex = toOrder.indexOf(object);
toOrder.splice(oldIndex, 1);
toOrder.splice(newIndex, 0, object);
// If you can guarantee your order properties were already indexed,
// this loop could instead be
// for (var i = Math.min(oldIndex, newIndex); i <= Math.max(oldIndex, newIndex); ++i)
for (var i = 0; i < toOrder.length; ++i) {
toOrder[i].order = i;
}
}
答案 1 :(得分:0)
更简单的解决方案(仍适用于任意order
值,而不仅仅是newOrder
是实际数组索引的位置):
myObject.order
设置为newOrder
(其中newOrder是目标位置的订单之间的某个数字)。 E.g -1
向前移动,或1.5
在#1
和#2
之间移动toOrder
数组,并将每个项目的order
设置为其索引(以便它再次变为整数或增加/减少以匹配新位置)