首页 > 解决方案 > 如果对象的顺序在另一个对象内发生变化,如何更新对象的序列属性?

问题描述

所以我有一个对象对象,其中每个内部对象都有它自己的seq属性,指向它在大对象内部的顺序。

例子:

const obj = {
  '1': {
    name: 'apple',
    seq: 1,
    id: 1,
  },
  '2': {
    name: 'orange',
    seq: 2,
    id: 2,
  },
  '3': {
    name: 'banana',
    seq: 3,
    id: 3,
  },
}

我的目标是移动这些对象并seq相应地更新它们。

例如

const obj = {
  '1': {
    name: 'apple',
    seq: 1,
    id: 1,
  },
  '3': {
    name: 'banana',
    seq: 2,
    id: 3,
  },
  '2': {
    name: 'orange',
    seq: 3,
    id: 2,
  },
}

我知道我正在移动的对象的 ID 以及它正在移动的位置

到目前为止我所拥有的

const moveObjects = (objId, indexToMoveTo) => {
  const objCopy = Object.values(obj).reduce((prev, curr) => {
    // if element if the one we moved - set seq to index
    if (curr.id === objId) {
      prev[curr.id] = {
        ...curr,
        seq: indexToMoveTo
      };
    } else if (curr.id !== objId) {
      // if element is not the one and index is smaller - increase seq by one
      if (curr.seq >= indexToMoveTo) {
        prev[curr.id] = {
          ...curr,
          seq: curr.seq + 1
        };
      }
      // if index bigger than seq - return the element without modifying it
      else if (curr.seq < indexToMoveTo) {
        prev[curr.id] = {
          ...curr
        };
      }
    }
    return prev;
  }, {})
  return objCopy
}

这样做的问题是,当然,如果你移动一个元素几次 seq 开始增加超过对象的长度,例如它可能变成 4、5、6。

这是 jsfiddle 的链接,可以更清楚地了解我的意思。(第三个console.log)

解决此问题的所有帮助将不胜感激

标签: javascriptobject

解决方案


要使对象实际更改位置,您必须更改键,因为对象中的键默认排序。

这是一种不同的方法

const obj = { '1': { name: 'apple', seq: 1, id: 1, }, '2': { name: 'orange', seq: 2, id: 2, }, '3': { name: 'banana', seq: 3, id: 3, }, }
const moveObjects = (objId, indexToMoveTo) => {
 arr= Object.entries(obj)
 tobj=arr.filter(o => o[1].id == objId).flat()
 tobj[1].seq = indexToMoveTo ,temp = tobj[0]
 tobj[0] = indexToMoveTo
 k = arr.splice(temp - 1, 1)
 arr.splice(indexToMoveTo-1, 0, k[0]);
arr.forEach((o,i)=>{o[1].seq = i+1, o[0] = i+1})
map=new Map([...arr])
 return Object.fromEntries(map)
}
console.log(moveObjects(3, 2))
console.log(moveObjects(1, 3))

如果你想保持键相同但只更改seq你可以使用相同的代码而不修改keys但是对象将保持在同一个地方

const obj = { '1': { name: 'apple', seq: 1, id: 1, }, '2': { name: 'orange', seq: 2, id: 2, }, '3': { name: 'banana', seq: 3, id: 3, }, }

 arr= Object.entries(obj)
const moveObjects = (objId, indexToMoveTo) => {
 arr= Object.entries(obj)
 tobj=arr.filter(o=>o[1].id==objId).flat()
 tobj[1].seq=indexToMoveTo ,temp=tobj[0]
 tobj[0]=indexToMoveTo
 k=arr.splice(temp-1,1)
 arr.splice(indexToMoveTo-1, 0, k[0]);
arr.forEach((o,i)=>{o[1].seq=i+1})
map=new Map([...arr])
 return Object.fromEntries(map)
}
console.log(moveObjects(3, 2))


推荐阅读