JavaScript通过变量访问JSON对象属性失败问题排查
问题根因
匹配失败的核心原因是JavaScript对象键严格区分大小写,而以太坊地址本身是大小写不敏感的:
- 你传入的测试地址
0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd是全小写格式 - 1inch官方接口实际返回的
tokens对象的键是EIP-55校验和格式的地址(包含大小写混合的字母,和你传入的全小写字符串不完全相等) - 你自行整理的接口返回示例使用了全小写键,和真实接口返回结构不符,因此用
in操作符做严格相等匹配时会判定为不存在。
修复代码
对地址做大小写归一化处理,不管传入参数、接口返回键是什么大小写格式,统一转成全小写后再做匹配,修复后的完整代码如下:
function getTokenDetails(findTokenAddress) { const url = `https://api.1inch.io/v4.0/1/tokens`; const xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.setRequestHeader("accept", "application/json"); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { const tokenMap = JSON.parse(xhr.responseText).tokens; // 入参统一转小写,兼容任意大小写格式的地址输入 const targetAddr = findTokenAddress.toLowerCase(); // 遍历所有token地址,转小写后匹配 const matchEntry = Object.entries(tokenMap).find(([addr]) => addr.toLowerCase() === targetAddr); const tokenDetails = matchEntry ? matchEntry[1] : null; if (tokenDetails) { console.log("匹配到代币详情:", tokenDetails); // 此处编写后续使用tokenDetails的业务逻辑 } else { alert("Could not find token in json?"); } } else { alert(`请求失败,状态码:${xhr.status}`); } } }; xhr.send(); } // 测试调用,全小写、混合大小写、EIP-55格式的地址都能正常匹配 getTokenDetails('0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd');
额外说明
- 上述修复兼容任意大小写格式的传入地址,不需要调用方提前转换地址格式
- 当前函数是异步请求,如果需要在函数外部拿到
tokenDetails结果,需要新增回调函数参数,或者把函数改写成Promise形式,不能直接在函数内部return后在外部同步获取结果。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

