Javascript 对数组进行排序,以便将元素从一个位置移动到另一个位置,同时保持“order”字段不变

Javascript 对数组进行排序,以便将元素从一个位置移动到另一个位置,同时保持“order”字段不变,javascript,Javascript,我试图根据数组的顺序字段对数组进行排序,但遇到了一些麻烦 假设我有以下数组 const array = [ {order: 3, name: 'A'}, {order: 10, name: 'B'}, {order: 11, name: 'C'}, {order: 23, name: 'D'}, {order: 47, name: 'E'}, {order: 91, name: 'F'}, ]; 请注意,每个后续对象的order字段不会比上一个对象大1。这没关系——唯一

我试图根据数组的
顺序
字段对数组进行排序,但遇到了一些麻烦

假设我有以下数组

const array = [
  {order: 3, name: 'A'},
  {order: 10, name: 'B'},
  {order: 11, name: 'C'},
  {order: 23, name: 'D'},
  {order: 47, name: 'E'},
  {order: 91, name: 'F'},
];
请注意,每个后续对象的
order
字段不会比上一个对象大1。这没关系——唯一重要的是数组是按升序排列的

现在,假设我试着移动

{order: 47, name: 'E'}
到数组的第二位(
array[1]
),同时保留所有
顺序

新阵列看起来像

[
  {order: 3, name: 'A'},
  {order: 47, name: 'E'},
  {order: 11, name: 'C'},
  {order: 23, name: 'D'},
  {order: 10, name: 'B'},
  {order: 91, name: 'F'},
];
我试图以这样的方式对这个新数组进行排序,输出应该是:

[
  {order: 3, name: 'A'},
  {order: 10, name: 'E'},
  {order: 11, name: 'B'},
  {order: 23, name: 'C'},
  {order: 47, name: 'D'},
  {order: 91, name: 'F'},
];
我怎样才能做到这一点

我试过下面这种东西的不同组合,但都没有用

const compare = (a, b) => {
  if (a.order < b.order) {
    return -1;
  } else if (a.order > b.order) {
      const temp = a.id;
      a.order = b.order;
      b.order = temp;

      return 1;
    }

  return 0; 
}

array.sort(compare);
const compare=(a,b)=>{
如果(a.订单b.订单){
常数温度=a.id;
a、 订单=b.订单;
b、 订单=温度;
返回1;
}
返回0;
}
排序(比较);

在这里有点蠢。我做错了什么?我还尝试过使用
splice
将元素拉出其原始位置,并将其放置在新的预期位置,但在
order
字段的排序方面遇到了问题。

我认为在排序过程中改变数组不一定是个好主意。您可以提取数组中的订单并
shift
以获取下一个订单?您也可以通过编程方式进行交换

const orders=[
{顺序:3,名称:'A'},
{顺序:47,名称:'E'},
{顺序:11,名称:'C'},
{顺序:23,名称:'D'},
{顺序:10,名称:'B'},
{顺序:91,名称:'F'},
];
函数排序器(){
常量allOrders=orders.map(({order})=>order);
排序((a,b)=>a-b);
退货订单。映射((订单)=>{
order.order=allOrders.shift();
退货单;
});
}
功能交换(idx1、idx2){
const ordersClone=orders.slice(0);
const tempOrder=orders[idx1]。order;
订单单[idx2]=订单[idx1];
OrdersOne[idx2]。订单=订单[idx2]。订单;
订单单[idx1]=订单[idx2];
ordersClone[idx1]。order=tempOrder;
退货通知单
}
控制台日志(排序器(命令));
控制台日志(交换(1,4))
const arr=[{
订单:3,
姓名:“A”
},
{
订单:47,
名称:“E”
},
{
订单:11,
姓名:“C”
},
{
订单:23,
姓名:“D”
},
{
订单:10,
姓名:'B'
},
{
订单:91,
名称:“F”
},
];
arr.sort(函数(a,b){
返回a.订单-b.订单;
});

console.log(arr)
排序时不要尝试修改数组。相反:

  • 用于将项目移动到新位置
  • 调整移动项目所在数组子部分的
    order
    参数:
  • 函数移动(arr、从索引到索引){
    //移动项目
    const[itemToMove]=arr.splice(fromIndex,1);//从迭代器中获取下一项
    阵列拼接(toIndex,0,itemToMove);
    //迭代并调整索引
    设指数=toIndex;
    while(index!==fromIndex){
    设nextIndex=fromIndexlog(move(数组,4,1))嗯,排序时不要更改
    顺序
    。你不太可能得到你想要的结果。事实上,排序时最好不要更改任何对象,而不管排序标准是什么。为什么开始时
    order
    name
    绑定在同一个数组中?您似乎希望将它们与另一个完全分开处理。移动后是否需要为
    E
    设置
    顺序:10
    ?如中所示,您是否需要保留
    顺序
    s,还是只需在间隙中查找任何值就可以了?我正在使用,并且正在尝试将请求的排序顺序保存到数据库中。记录按特定顺序排列,其中
    顺序
    是唯一的。我正在尝试更改顺序。@VLAZ我需要保留
    顺序
    我认为问题不是按顺序排序,而是用名称保留当前顺序,而是更新
    顺序
    属性。(即A、e、C的顺序不正确)