如何使用Lodash提取嵌套JSON对象中最内层的amount键对应数值
使用Lodash提取JSON对象中最内层的amount数值
嘿,我明白你为啥用findKey和pick没搞定了——这些方法在处理嵌套层级深、结构还不一样的JSON对象时确实不太顺手。别担心,用Lodash的话有几个靠谱的办法能轻松提取到每个对象里最内层的amount数值,咱们一步步来:
方案一:针对每个对象的结构直接用_.get()
_.get()是Lodash里处理嵌套路径的神器,它能直接指定要提取的属性路径,还能处理数组索引,甚至找不到时可以返回默认值。针对你给出的三个对象,具体用法如下:
首先假设你已经导入了Lodash:
const _ = require('lodash');
然后逐个提取:
// 第一个对象 const obj1 = { "coins": [], "contract": "terra1u0t35drzyy0mujj8rkdyzhe264uls4ug3wdp3x", "execute_msg": { "send": { "amount": "1000000", "contract": "terra1ltnkx0mv7lf2rca9f8w740ashu93ujughy4s7p", "msg": "eyJkZXBvc2l0X2NvbGxhdGVyYWwiOnt9fQ==" } }, "sender": "terra194rswjxvv0a2fm3f8hr4e4f3443dl3s7frsyhp" }; const amount1 = Number(_.get(obj1, 'execute_msg.send.amount')); // 输出:1000000 // 第二个对象 const obj2 = { "amount": [ { "amount": "1000000", "denom": "uusd" } ], "from_address": "terra194rswjxvv0a2fm3f8hr4e4f3443dl3s7frsyhp", "to_address": "terra1ux73wdfgmu7r5us2sf0u9vdmrfxuhdk8760zzj" }; const amount2 = Number(_.get(obj2, 'amount[0].amount')); // 输出:1000000 // 第三个对象 const obj3 = { "coins": [ { "amount": "2000000", "denom": "uusd" } ], "contract": "terra15dwd5mj8v59wpj0wvt233mf5efdff808c5tkal", "execute_msg": { "deposit_stable": {} }, "sender": "terra194rswjxvv0a2fm3f8hr4e4f3443dl3s7frsyhp" }; const amount3 = Number(_.get(obj3, 'coins[0].amount')); // 输出:2000000
方案二:写一个通用函数自动提取(适配更多类似结构)
如果以后还有结构不同但都包含最内层amount的对象,你可以写一个递归遍历的通用函数,自动找到所有最内层的amount值:
function extractInnerAmount(obj) { let targetAmount; // 递归遍历对象的每个属性 _.forEach(obj, (value, key) => { // 找到键名为amount且值是字符串的(也就是最内层的amount) if (key === 'amount' && typeof value === 'string') { targetAmount = Number(value); } // 如果当前值是对象/数组,继续递归查找 else if (_.isObject(value)) { const innerResult = extractInnerAmount(value); if (innerResult !== undefined) { targetAmount = innerResult; } } }); return targetAmount; } // 测试三个对象 console.log(extractInnerAmount(obj1)); // 1000000 console.log(extractInnerAmount(obj2)); // 1000000 console.log(extractInnerAmount(obj3)); // 2000000
为啥之前的方法没生效?
findKey只能找到当前层级的键名,没法深入嵌套结构;pick也是提取指定层级的属性,遇到数组或者多层嵌套的对象就无能为力了。而_.get()直接支持路径表达式,递归方法则能自动遍历所有层级,完美适配你的场景。
内容的提问来源于stack exchange,提问作者Andon Mitev
相关产品推荐
相关产品推荐

