Javascript 对对象数组中的元素重新排序

Javascript 对对象数组中的元素重新排序,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个对象数组: const array = [ { id: "5a2524432b68c725c06ac987", customOrder: 1, name: "One", }, { id: "5a2524432b68sgs25c06ac987", customOrder: 2, name: "Two", }, { id: "5a252wfew32b68c725c06ac987", customOrder:

我有一个对象数组:

const array = [
  {
    id: "5a2524432b68c725c06ac987",
    customOrder: 1,
    name: "One",
  },
  {
    id: "5a2524432b68sgs25c06ac987",
    customOrder: 2,
    name: "Two",
  },
  {
    id: "5a252wfew32b68c725c06ac987",
    customOrder: 3,
    name: "Three",
  },
  {
    id: "5a25gffe32b68c725c06ac987",
    customOrder: 4,
    name: "Four",
  },
  {
    id: "5a2524432b68c725c06acfee7",
    customOrder: 5,
    name: "Five",
  },
  {
    id: "5a2524432b68c725c06ac556",
    customOrder: 6,
    name: "Six",
  },
]
当我更新其中一个对象的customOrder并基于customOrder更新其他对象时,因此如果我将索引2更改为具有4的自定义顺序,我需要编辑其他元素的customOrder,这样结果将是:

const array = [
  {
    id: "5a2524432b68c725c06ac987",
    customOrder: 1,
    name: "One",
  },
  {
    id: "5a2524432b68sgs25c06ac987",
    customOrder: 2,
    name: "Two",
  },
  {
    id: "5a25gffe32b68c725c06ac987",
    customOrder: 3,
    name: "Four",
  },
  {
    id: "5a252wfew32b68c725c06ac987",
    customOrder: 4,
    name: "Three",
  }
  {
    id: "5a2524432b68c725c06acfee7",
    customOrder: 5,
    name: "Five",
  },
  {
    id: "5a2524432b68c725c06ac556",
    customOrder: 6,
    name: "Six",
  },
]

我正在考虑使用array.slice,甚至使用lodash.putAt,但我正在尝试想出一种实现最佳效果的简单方法

您可以通过四个步骤完成:

使用Array.findIndex查找与给定索引处要更新的值具有相同值的条目

然后将此项的值更改为给定索引处的项的值

然后用新值更新给定索引处的项

最后,交换项目。如果没有具有新值的项,请对数组进行排序,以确保该项放置在正确的位置

此版本会对阵列进行变异:

const数组=[{id:5a2524432b68c725c06ac987,customOrder:1,name:1,},{id:5a2524432b68sgs25c06ac987,customOrder:2,name:2,},{id:5a252wfew32b68c725c06ac987,customOrder:3,name:3,},{id:5A25FFE32B68C725C06AC987,customOrder:4,name:4,},{id:5A2524432B68C725C06AC7,customOrder:5,name,},{id:5A25252B726AC556,] 常量交换=arr,x,y=>[arr[x],arr[y]]=[arr[y],arr[x]]; 函数setOrderarr,idx,value{ const idx2=arr.findIndexx=>x.customOrder==value; 如果idx2>=0 arr[idx2]。customOrder=arr[idx]。customOrder; arr[idx].customOrder=value; 如果idx2>=0,则为swapar,idx,idx2; else arr.sorta,b=>a.customOrder-b.customOrder; 返回arr; } setOrderarray,2,4; console.logarray; setOrderarray,2,10; console.logarray 您可以使用删除索引处的项并将其移动到指定的新索引。然后使用更新customOrder

如果不想改变原始数组,可以使用扩展语法获取数组的副本,并使用map

const数组=[{id:5a2524432b68c725c06ac987,customOrder:1,name:1,},{id:5a2524432b68sgs25c06ac987,customOrder:2,name:2,},{id:5a252wfew32b68c725c06ac987,customOrder:3,name:3,},{id:5A25FFE32B68C725C06AC987,customOrder:4,name:4,},{id:5A2524432B68C725C06AC7,customOrder:5,name,},{id:5A25252B726AC556,] 函数updateOrderinput,index,newIndex{ 让copy=[…输入]; const removed=copy.index,1; copy.newindex,0,删除[0]; 返回copy.mapa,i=>{…a,customOrder:i+1} }
logupdateOrderarray,2,3我认为您必须使用一些排序功能。例如,合并排序只是一个示例,并应用基于customOrder键的排序。数组索引中已经有了顺序,因此customOrder是多余的。如果你想移动某物,就移动它;然后,如果仍然需要customOrder,请使用array.forEachx重新标记它。i=>x.customOrder=i+1。您的问题有两个问题陈述:1。更新相关对象。所以,当您将索引2处的对象更新为4时,还必须回溯其他对象并对其进行更改。2.要保持顺序,您必须对列表进行排序。如果更改非密切相关对象的顺序,该怎么办?只需一个小指针。您已经有了两个要切换值的对象的位置/索引。切换对象而不是切换customerOrder然后再进行排序,这样做没有意义吗?@Rajesh,你完全正确,那样会更理想,我会更新我的答案