如何从Web3.js的web3.eth.Contract.getPastEvents返回的returnValues: Result{}中提取account值
解决Web3.js getPastEvents返回Result对象中提取account的问题
嘿,我懂你现在的困扰——getPastEvents返回的returnValues看着是个Result {}对象,明明知道里面有数据,却不知道怎么顺畅提取account值对吧?其实这个Result是Web3.js做了包装的可枚举对象,用几种简单方式就能轻松拿到你要的内容。
方法1:直接通过属性访问
哪怕控制台打印显示的是Result {},它里面的属性依然可以用点语法或者方括号直接访问。修改你的代码试试:
for (const element2 of lendingPairList) { const eventPair = new web3.eth.Contract(PairContractABI, element2) eventPair.getPastEvents("Deposit", { fromBlock: 12867493, toBlock: 'latest' }) .then(events => { // 遍历每一条事件日志 events.forEach(event => { // 直接提取account值 const targetAccount = event.returnValues.account; // 也可以用方括号写法:event.returnValues['account'] console.log("提取到的account地址:", targetAccount); }); }) .catch((err) => console.error(err)); }
方法2:转换为普通JavaScript对象
如果你更习惯操作普通对象,可以用展开运算符或者Object.assign()把Result转换成普通对象,这样结构会更直观:
events.forEach(event => { // 转换为普通对象 const plainValues = { ...event.returnValues }; const targetAccount = plainValues.account; console.log("转换后提取的account:", targetAccount); });
关于你之前尝试的过滤和topics方式
你提到按文档用topics过滤没成功,大概率是因为Deposit事件里的account参数没有被Solidity的indexed关键字修饰——topics只能用来过滤被标记为indexed的参数,未被修饰的参数会被放在returnValues里,所以这种方式本来就不适合提取非索引参数,这不影响你从returnValues里拿值。另外记得确认你的PairContractABI里Deposit事件的定义是正确的,确保account是该事件的合法参数,这样Web3.js才能正确解析出对应属性。
内容的提问来源于stack exchange,提问作者SimpleMachine92
相关产品推荐
相关产品推荐

