Arrays

在新結構中初始化結構數組

  • October 17, 2018

跟進不同類型的二維數組的問題:不同類型的二維數組?

在創建新結構(項目)時如何初始化一個新的結構數組(投票)

pragma solidity ^0.4.25;

contract Votinggame{

      struct Vote {
         address voter;
         string comment;
     }

       struct Project{
           int id;
           string name;
            int votes;
           Vote[] vote;
       }

       Project[] public projects;
       int idcounter=-1;

    function addNewProject(string name) public {

            Project memory newProject = Project({
                id:idcounter+1,
                name:name,
                votes:0

                // How to initialise new vote array of struct Vote inside Project struct ??
                // vote: new Vote[](0) -> this is not working "UnimplementedFeatureError: Copying of type struct HotOrNotCrypto.Vote memory[] memory to storage not yet supported."

            });
          idcounter=newProject.id;
          projects.push(newProject); 
       }

     function vote(uint index , string comment) public {
       Project storage project = projects[index];
       project.votes++;     
       Vote memory v;
       v.voter = msg.sender;
       v.comment = comment;
       project.voters.push(v);
     }
   }
function getProjects() public view returns (uint){
        return (projects.length);
      }
}

還要對此進行擴展,如何在 React 中顯示投票結構的投票數組。目前我正在使用 .fill().map() 顯示項目結構的項目數組

 static async getInitialProps(){

   const getProjects = await Contract.methods.getProjects().call();
   const projectsList = await Promise.all(
   Array(parseInt(getProjects))
   .fill()
   .map((element, index)=> {
     return Contract.methods.projects(index).call()
   }));
 const sorted_projects = _.orderBy(projectsList, ['votes'], ['desc']);


  return { sorted_projects};

 }

然後為每個結構元素渲染新的表格行,如下所示:

 renderRow(){
   return (

     this.props.sorted_projects.map((sorted_projects,key)=>{
     return <RequestRow
       id= {key+1}
       key ={key}
       sorted_projects ={sorted_projects}
     />;

 }));

我想這與我必須提供我想要投票數組顯示的項目索引的區別有點相似

您最好的選擇是使用以下方式:


   function addNewProject(string name) public {
       uint lastIndex = projects.length++;
       Project storage project = projects[lastIndex];
       project.id = ++idcounter;
       project.name = name;
   }

所有未定義的儲存都已定義為零。零數組是一個空數組。所以:

  • project.votes已經是0,無需設置。
  • project.vote已經初始化為一個空數組。

另外,你不需要這樣做,project.votes++;因為那是相同的資訊project.voters.length,所以節省一些氣體。

您可能想自己製作Project[] private projects;和編寫吸氣劑,以便您可以project.voters.length在其他人中返回。

哦,更好的命名:function getProjectCount()

引用自:https://ethereum.stackexchange.com/questions/60728