javascript - 如果对象的顺序在另一个对象内发生变化,如何更新对象的序列属性?
问题描述
所以我有一个对象对象,其中每个内部对象都有它自己的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)
解决此问题的所有帮助将不胜感激
解决方案
要使对象实际更改位置,您必须更改键,因为对象中的键默认排序。
这是一种不同的方法
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))
推荐阅读
- angular - 角度路由:为子 :ID 路径添加前缀
- python - 无法正确导入kivy
- vhdl - 如何减少 Modelsim 中的 WLF 文件大小?
- python - 从两个矩阵的比较中创建新矩阵
- jquery - 仅当内部最后一个 li 具有 .active 时才添加下一个按钮新类
- javascript - 如何将星级值保存到本地存储以及页面重新加载时如何显示?
- javascript - 单击 Windows 任务栏的固定图标时,将重定向到“chrome://extensions”而不是打开应用程序窗口
- python - 是否可以使用 Django 和 web3.js 构建 DApp?
- amazon-web-services - Terraform 覆盖 AWS 托管策略
- android - Android 将音频/mp3 文件保存到外部存储