javascript - 对于移动位置排序有什么好的办法吗?
高洛峰
高洛峰 2017-04-11 13:31:42
[JavaScript讨论组]

有一个物品列表,默认按照发布的时间 自增 ID 排序例如

1 : 物品1
2 : 物品2
3 : 物品3
...

如果我想移动

922 : 物品922

到第 100个位置.

那么这个排序,除了循环后面的内容吧位置全部+1外,有什么好方法吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
阿神

SQL 就一句话的事情,也不是很麻烦吧

update  tablename
set     order = order + 1
where   order > 100
;

如果是在程序里,用链表也是很容易解决的。JS 的 Array 貌似是链表实现的,所以可以直接用 splice 来实现插入。

巴扎黑

循环内容补加一应该是线性表顺序存储结构的特点,他的缺点恰恰就是插入和删除
可以采用链表的方式。
链表的实现原理是列表中各项在内存中随意存储,但是每一项中都存有下一项内存的指针。这样可以通过第一个元素的指针找到第二个元素,然后找到第三个。这样如果要增删的话只要改变相应几项的指针地址就可以了。
比如要把6插到3的位置。那么只要把5的下一项指针改成7,6就被删除了,然后把2的下一项指针改成6,6的下一项指针改成3,整个就实现了移动操作,大大降低时间复杂度。
当然上面是理论。
----实践分割线-------
对应js可以使用splice

伊谢尔伦

如果你的改动不是特别大的话,比如每次的操作只是上下移一个位置(我们的项目需求),就只需要把两条数据的sort字段的数据(权重)互换就可以了,sort字段里就是数字,排序的话按照这个顺序走就可以了

PHP中文网
/**
 * 数组元素位置替换
 * @param  {[Array]} array       [被替换的目标数组]
 * @param  {[Array]} changeIndex [{from:n,to:m},{from:n1,to:m1},{}]
 * @return {[Array]}             [替换后的数组]
 */
function arrayChangeIndexs(array, changeIndexs) {
    var result = array.concat([]);
    for (var i = 0; i < changeIndexs.length; i++) {
        result[changeIndexs[i].from] = array[changeIndexs[i].to];
        result[changeIndexs[i].to] = array[changeIndexs[i].from];
    }
    return result;
}

//测试
arrayChangeIndexs([1, 2, 3, 4], [{
    from: 0,
    to: 3
}, {
    from: 1,
    to: 2
}]);

返回===> [4, 3, 2, 1]
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号