数据排序问题

有一个排序需求,需要实现:当前数据往后移动N位或者向前移动N位。想了半天,没想到好的解决办法。

操作对象是数据库一条数据

希望能在损耗最少的情况下,实现

阅读 3.3k
5 个回答

核心思想是将数组依据原始位置和新位置”切割“成几部分,调整位置后重新合并,不涉及排序。
并且,我给的方案能左移也能右移动

PS. 看到题目变更,目标是数据库,欲哭无泪!

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

/**
i: 目标元素的index
steps: 移动步数,正数向右移动,负数向左移动
inArray: 目标数组
*/
function moveStepsInArray(i, steps, inArray) {
    if(i<0 || i>inArray.length - 1 || steps === 0) {
        return inArray;
    }
    var newPosition = i + steps;

    if(newPosition < 0) {
        newPosition = 0;
    }
    if(newPosition > inArray.length - 1) {
        newPosition = inArray.length - 1;
    }

    var front = steps > 0 ? i: newPosition;
    var after = steps > 0 ? newPosition: i;

    var targetVal = inArray[i];

    if(steps > 0) {
        return inArray.slice(0, front)
            .concat(inArray.slice(front + 1, after + 1))
            .concat([targetVal])
            .concat(inArray.slice(after + 1)) 
    }

    if(steps < 0) {
        return inArray.slice(0, front)
            .concat([targetVal])
            .concat(inArray.slice(front, after))
            .concat(inArray.slice(after + 1));
    }
}

moveStepsInArray(4, -3, arr); //将arr中的第4个元素向左移动3步

获取排序前的位置a,和排序后的位置b
如果a > b(往前移),只要重排b-a
如果a < b(往后移),只要重排a-b

js可能如下处理:

const array = [1, 2, 4, 5, 6, 7, 8, 9, 3, 10];

const arrayMoveTo = (arr, start, end) => {
  if(start > arr.length || end > arr.length || start < 1 || end < 1) {
    throw new Error('');
  }
  const temp = arr.splice(start - 1, 1)[0];
  arr.splice(end - 1, 0, temp);
  return arr;
};

console.log(arrayMoveTo(array, 9, 3));
//[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

设每个数据项都有一个属性 ORDER,范围 0.000001.00000,移动或者插入任意一个节点,前后 ORDER 可被无限分段,其他已有节点不受影响,分段值可直接计算。

哈哈哈 今天刚好看到这种提 这个叫做旋转数组 我发发发 很简便的代码 忘采纳哦 最近才开始玩 需要刷点分

var numArr = [1,2,3,4,5,6,7]
var rotate = function(nums, k) {
    var a = nums.splice(-k,k)
    nums.unshift(...a)
    return nums
}
var rotate2 = function(nums, k) {
    nums.splice(0,0,...nums.splice(-k,k))
    return nums
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题