【问题标题】:How to update sequence property of an object if it's order is changing inside another object?如果对象的顺序在另一个对象内发生变化,如何更新对象的序列属性?
【发布时间】:2020-11-16 10:33:32
【问题描述】:

所以我有一个对象对象,其中每个内部对象都有它自己的 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 的 link,以便更清楚地了解我的意思。 (第三个console.log)

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

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    为什么你不只是使用一个数组,那么你就不需要使用Object.values,而且你可以随时访问索引,不需要在你的对象中存储seq

    【讨论】:

      【解决方案2】:

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

      这是一种不同的方法

      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))

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多