javascript - 使用订单号反应更改数组的选定项目索引
问题描述
嗨,我是 Reactjs 的新开发人员。我有个问题。这可能很简单,但我想学习根据用户订单号更改数组的选定项目索引的最佳实践或最佳方法。我的意思是用户将从 Input 中给出一个数字,我将使用该数字放置在数组中。
我的状态中的示例对象数组:
const [state, setState] = useState({
dragFrames:
[{id:1,name:"test-1",zIndex:1},
{id:2,name:"test-2",zIndex:2},
{id:3,name:"test-3",zIndex:3}]
})
用户 zIndex在 id 为3的项目中输入“1”
我预期的新数组顺序如下:
dragFrames:
[id:3,name:"test-3",zIndex:1},
{id:1,name:"test-1",zIndex:2},
{id:2,name:"test-2",zIndex:3}
]
我可以更改和设置任何对象的 zIndex 编号,但我不能根据输入值更改数组顺序。我怎样才能做到这一点?你可以帮帮我吗 ?
我以前试过这个,但我遇到了无限循环:
if (e.target.value>0) {
nowDev.z = e.target.value
var arrayCopy = state.dragFrames.slice()
state.dragFrames.map((item:any,index:any)=>{
if (index===e.target.value) {
arrayCopy.push(nowDev)
}else{
arrayCopy.push(item)
}
})
setState({ dragFrames: arrayCopy})
}
解决方案
首先,您需要更改数组中所有元素的 zIndex。它的算法将如下:
- 映射数组并增加所有元素的 zIndex
- 对于用户设置的元素,将其 zIndex 设置为 1
完成上述操作后,按 zIndex 排序。
代码如下:
df = [{id:1,name:"test-1",zIndex:1},
{id:2,name:"test-2",zIndex:2},
{id:3,name:"test-3",zIndex:3}];
const updatedDF = df.map(x => {
if(x.id === 3) return {...x, zIndex: 1} // replace 3 with e.target.value
else return {...x, zIndex: x.zIndex + 1}
});
updatedDF.sort((x, y) => x.zIndex - y.zIndex)
console.log(updatedDF)
推荐阅读
- java - 调试 servlet 时跳过/步进过滤框架类
- mysql - MySQL Stored Proc 构建多维 JSON
- python - 如何将 Qt5 Tree 反向引用到一组数据?
- r - 当值高于阈值时返回列名
- ios - 无法读取输出控制台 Flutter
- reactjs - ReactJS路由器不渲染组件
- node.js - 在他们选择的时间向选择加入的用户发送推送通知
- react-native - 如何从 Reac Native 应用程序访问使用 cordova-plugin-secure-storage 存储的数据?
- python - 最终摘要未正确计算
- docker-compose - mailcow + jwilder 反向代理