Javascript 更新数组项顺序而不移动它

Javascript 更新数组项顺序而不移动它,javascript,Javascript,我有以下对象数组 [ { id: 1, title: 't1', order: 0 }, { id: 2, title: 't1', order: 1 }, { id: 3, title: 't1', order: 2 }, ] 我想多次重新订购物品。 在第一次尝试中 // move id: 1, fromOrder: 0, toOrder: 2 [ { id: 1, title: 't1', order: 2 }, { id: 2, title: 't2', order:

我有以下对象数组

[
  { id: 1, title: 't1', order: 0 },
  { id: 2, title: 't1', order: 1 },
  { id: 3, title: 't1', order: 2 },
]
我想多次重新订购物品。
在第一次尝试中

// move id: 1, fromOrder: 0, toOrder: 2
[
  { id: 1, title: 't1', order: 2 },
  { id: 2, title: 't2', order: 0 },
  { id: 3, title: 't3', order: 1 },
]
在第二次尝试中

// move id: 3, fromOrder: 1, toOrder: 0
[
  { id: 1, title: 't1', order: 2 },
  { id: 2, title: 't2', order: 1 },
  { id: 3, title: 't3', order: 0 },
]
正如您所看到的,重点是我不打算移动项目,我只想更新order属性

我做了如下类似的事情,但它并没有像预期的那样工作

const reorder = (array, id, oldIndex, newIndex) => {
  const ordered = array
    .map(item => item.order === newIndex ? { ...item, order: oldIndex } : item)
    .map(item => item.id === id ? { ...item, order: newIndex } : item);
  
  return ordered;
};
回答后第三方澄清编辑
用户希望改变所有项目的顺序(包括换行),而不仅仅是交换两个值,保留相对顺序。

最符合您的代码选项 您所要做的就是计算开始索引和结束索引之间的差异,并将所有项目的顺序按该值移动

const-reorder=(数组、id、旧索引、新索引)=>{
orderShift=newIndex-oldinex;
const ordered=array.map(项=>{
item.order=mod(item.order+orderShift,array.length);
退货项目;
});
订购退货;
};
最有效的选择 下面的代码是一个优化的函数,因为您不需要指定项目的id或任何特定的索引,只需要指定偏移量

const-reorder=(数组,移位)=>{
for(让i=0,len=array.length;iMost为您的代码选项
您所要做的就是计算开始索引和结束索引之间的差异,并将所有项目的顺序按该值移动

const-reorder=(数组、id、旧索引、新索引)=>{
orderShift=newIndex-oldinex;
const ordered=array.map(项=>{
item.order=mod(item.order+orderShift,array.length);
退货项目;
});
订购退货;
};
最有效的选择 下面的代码是一个优化的函数,因为您不需要指定项目的id或任何特定的索引,只需要指定偏移量

const-reorder=(数组,移位)=>{

for(设i=0,len=array.length;i我将只使用for循环并增加数组,当到达数组的最大值或末尾时,将其跳回零

var数据=[
{id:1,标题:“t1”,顺序:0},
{id:2,标题:'t2',顺序:1},
{id:3,标题:“t3”,顺序:2},
{id:4,标题:“t4”,顺序:3},
{id:5,标题:“t5”,顺序:4},
{id:6,标题:“t6”,顺序:5},
{id:7,标题:'t7',顺序:6},
{id:8,标题:'t8',顺序:7},
];
const debugIt=array=>console.log(array.map(x=>`${x.id}-${x.order}');
常量重新排序=(数组、id、新索引)=>{
让index=array.findIndex(x=>x.id==id);
var max=array.length-1;
对于(var i=0;i max)指数=0;
如果(newIndex>max)newIndex=0;
}
};
调试(数据);
重新排序(数据,4,0);
调试(数据);
重新排序(数据,7,0);

debugIt(data);
我只会使用for循环并增加数组,当到达最大值或数组末尾时,将其跳回零

var数据=[
{id:1,标题:“t1”,顺序:0},
{id:2,标题:'t2',顺序:1},
{id:3,标题:“t3”,顺序:2},
{id:4,标题:“t4”,顺序:3},
{id:5,标题:“t5”,顺序:4},
{id:6,标题:“t6”,顺序:5},
{id:7,标题:'t7',顺序:6},
{id:8,标题:'t8',顺序:7},
];
const debugIt=array=>console.log(array.map(x=>`${x.id}-${x.order}');
常量重新排序=(数组、id、新索引)=>{
让index=array.findIndex(x=>x.id==id);
var max=array.length-1;
对于(var i=0;i max)指数=0;
如果(newIndex>max)newIndex=0;
}
};
调试(数据);
重新排序(数据,4,0);
调试(数据);
重新排序(数据,7,0);

debugIt(data);
正如一篇被删除的帖子所说,你不需要问
oldIndex

根据我对代码的理解,您可以切换放置数组项,而不是四处移动。您需要做的是减少或增加新旧索引之间所有元素的索引:

const-reorder=(数组、id、新索引)=>{
constOldIndex=array.findIndex(item=>item.id==id);
常数有序=数组
.map(项目=>
(item.order>oldIndex&&item.order=newIndex)?//oldIndex的隐式检查>newIndex
{id:1,标题:“t1”,顺序:item.order+1}:
(item.id==id)?
{id:1,标题:'t1',顺序:newIndex}:
项目
);
订购退货;
};

正如一篇被删除的帖子所说,你不需要问
oldIndex

根据我对代码的理解,您可以切换放置数组项,而不是四处移动。您需要做的是减少或增加新旧索引之间所有元素的索引:

const-reorder=(数组、id、新索引)=>{
constOldIndex=array.findIndex(item=>item.id==id);
常数有序=数组
.map(项目=>
(item.order>oldIndex&&item.order=newIndex)?//oldIndex的隐式检查>newIndex
{id:1,标题:“t1”,顺序:item.order+1}:
(item.id==id)?
{id:1,标题:'t1',顺序:newIndex}:
项目
);
订购退货;
};

新订单的规则是什么?调用“重新排序”的代码部分是什么样子的?示例如下incomplete@epascarello我只想根据最近的更新数组更新
订单
。没有特定规则。“根据最近的更新数组”仍然不知道这是什么意思。我只使用您提供的代码尝试了这段代码,结果成功了:
arr=reorder(arr,1,2,2);arr=reorder(arr,2,0,1);arr=reorder(arr,3,1,0)
新订单的规则是什么?调用“重新排序”的代码部分是什么样子的?示例如下incomplete@epascarello我只想根据最近的更新数组更新
订单
。没有特定规则。“根据最近的更新数组”仍然不知道这是什么意思。我只使用您提供的代码尝试了这段代码,结果成功了:
arr=reorder(arr,1,2,2);arr=reorder(arr,2,0,1);arr=reorder(arr,3,1,0);