javascript - 当我更改状态时,为什么排序不能正常工作?
问题描述
我有 BubbleSort 组件,但是当我开始排序过程时出现问题并且我的排序工作不正确。我敢肯定,算法本身是正确编写的。我想设置状态过程有问题,但无法弄清楚它可能是什么。
import React, {Component} from "react";
import ArrayView from "../ArrayView/ArrayView";
export default class BubbleSort extends Component{
state = {
elements: this.props.elements
}
sort = () => {
const length = this.state.elements.length;
for (let i = 0; i < length; i++) {
for (let j = i + 1; j < length; j++) {
if (this.state.elements[i].value > this.state.elements[j].value) {
this.swap(i, j);
}
}
}
}
swap = (first, second) => {
this.setState((state) => {
const newElements = [...state.elements];
const temp = newElements[first];
newElements[first] = newElements[second];
newElements[second] = temp;
return {
elements: newElements
}
})
}
render() {
const { elements } = this.state;
return (
<ArrayView elements={elements} onSort={this.sort} />
)
}
}
解决方案
问题是您每次都在状态中交换元素,而不是sort
在实际排序的数组(本地elements
数组)中交换它们。elements
因此对本地数组的后续操作sort
继续使用旧值,这意味着冒泡排序将无法正常工作。
除非您希望您的组件在每次交换时更新 DOM(这意味着对其进行重大更改),否则只需更改一次状态,并在完成排序后设置新数组。
推荐阅读
- javascript - 运行应用程序时出现 Sequelize index has been exist 错误
- linux - 如何使用 find、ls 命令根据数组中的条目显示文件名?
- java - 使用 ADAL4J 的 OneDrive 身份验证
- python - Python - 解析 DAX 表达式并识别表和字段
- javascript - 为什么 isNaN(undefined) !== Number.isNaN(undefined) 是真的
- elasticsearch - elasticsearch StatefulSet pod 挂载卷失败
- reactjs - 在 React ES6 中使用 module.exports
- c++ - 使用 openssl 和 C++ 验证 JWT 的确切 base64 url 解码规则和实现是什么
- node.js - 如何使用 Sequelize 分解代码并从我的函数中获取结果?
- sql - 将 CURRENT_TIMESTAMP 从 UTC 转换为 EST