繁体   English   中英

从 Solidity 中的嵌套映射中获取所有项目

[英]Get all Items from nested mapping in Solidity

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

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract DgramMap is ERC721URIStorage {
    struct TokenDetails {
        string src;
        uint256 sell_price;
        string uniqueId;
    }

    mapping(address => mapping(uint256 => TokenDetails)) public userStructs;

    constructor(address payable _admin) ERC721("Dgram Token", "DT") {
    }

    function add(uint256 _id, address _user) public returns (uint256) {
        TokenDetails memory _tokenDetails = TokenDetails(
            "abc.com",
            12,
            "abcs1234"
        );
        userStructs[_user][_id] =  _tokenDetails;
        return _id;
    } 

    function deleteMap(uint256 _tokenId, address _user) public returns (uint256) {
        delete userStructs[_user][_tokenId];
        return _tokenId;
    } 

    function getItems(address _u) public view returns (TokenDetails memory) {

        // Here I want to return hall TokenDetails[_u]
        return TokenDetails[_u];
    }

}

如何从 GetItems 获取 TokenDetails[_u] hall? 我也不能在这里使用长度。 如果有的话,建议任何替代方式。 我想要这种类型的结构 [ { keyname: {} }]。

您可以在映射中嵌套存储数组,而不是嵌套映射,如下所示:

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

contract MappingsC {
    struct Item {
        uint groupId;
        uint itemId;
    }
    
    mapping(uint => Item[]) private items;
    
    function setItem(uint groupId, uint itemId) public {
        items[groupId].push(Item(groupId, itemId));
    }

    function getItem(uint groupId, uint itemId) public view returns (Item memory) {
        return items[groupId][itemId];
    }
    
    function getItems(uint groupId) public view returns (Item[] memory) {
        return items[groupId];
    }
}

这样,您可以通过将groupIditemId传递给getItem(...)来单独返回每个项目,并且仍然能够通过将groupId传递给getItems(...)来返回整个嵌套存储数组。 这与映射不同,因为数组是可迭代的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM