You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity中遍历结构体数组并修改指定结构体成员的问题

Solidity代码错误修正与优化

问题分析与修复点:

  1. 字符串比较与赋值符号错误
    Solidity中不能直接用==比较string类型,需通过哈希值对比;同时你在if判断里误用了赋值符号=,正确写法是用keccak256(abi.encodePacked())处理字符串后再用==比较。

  2. 数组越界问题
    循环条件i <= customers.length会导致访问数组索引超出范围,应该改为i < customers.length。

  3. 结构体字段名不匹配
    结构体Customers定义的等级字段是level,但代码中误写为ticketLevel,需修正为level。

  4. 数据一致性问题
    原代码维护了nameToTicketLevel映射,但升级等级时未同步更新该映射,会导致数组与映射数据不一致,需补充映射更新逻辑。

修正后的完整代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;

contract LevelUp {

    struct Customers {
        string name;
        uint256 level;
    }
    Customers[] public customers;
    mapping (string => uint256) nameToTicketLevel;

    function addCustomer(string memory _name, uint256 _ticketLevel) public {
        customers.push(Customers(_name, _ticketLevel));
        nameToTicketLevel[_name] = _ticketLevel;
    }

    function levelUp(string memory _name) public {
        for (uint i = 0; i < customers.length; i++ ){
            if (keccak256(abi.encodePacked(customers[i].name)) == keccak256(abi.encodePacked(_name))){
                customers[i].level += 1;
                nameToTicketLevel[_name] += 1;
                break; // 找到对应客户后跳出循环,避免不必要遍历
            }
        }
    }
}

补充说明:在找到匹配的客户后添加break语句,可减少不必要的循环遍历,节省Gas费用。

内容的提问来源于stack exchange,提问作者LukeS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:22:44