Node.js中用Underscore查找嵌套对象中targetName=bob的环境名称
解决嵌套对象中查找targetName为bob的环境名称问题
嘿,我来帮你搞定这个嵌套对象查找的问题!首先得先明确下你的对象结构大概是啥样——我猜应该是类似这样的(如果不是的话,你可以调整下例子里的结构适配你的情况):
const environments = { dev: { targetName: 'alice' }, prod: { targetName: 'bob' }, test: { targetName: 'charlie' } };
用Underscore的chain/where处理的正确姿势
你之前出现语法错误,大概率是因为直接对嵌套对象用where,但where是用来处理数组的,所以得先把对象转成符合要求的数组结构,再链式调用处理:
const _ = require('underscore'); const matchingEnv = _.chain(environments) // 第一步:把每个环境的键值对转成包含环境名和target信息的对象 .mapObject((targetInfo, envName) => ({ envName, ...targetInfo })) // 第二步:把对象转成数组(因为where需要数组输入) .values() // 第三步:筛选出targetName等于'bob'的项 .where({ targetName: 'bob' }) // 第四步:提取环境名称 .pluck('envName') // 第五步:获取最终结果(如果有多个匹配项,会返回数组) .value(); console.log(matchingEnv); // 输出: ['prod']
每一步的作用都标出来了,这样链式调用就不会有语法问题啦~如果只需要第一个匹配的环境名,可以在最后加个.first()再.value()。
不用Underscore的原生JS方案
其实原生JS也能轻松搞定,甚至更简洁,给你两种常用写法:
写法1:找第一个匹配的环境名
// 用Object.entries把对象转成键值对数组,再用find筛选 const [targetEnv] = Object.entries(environments).find(([key, info]) => info.targetName === 'bob') || []; console.log(targetEnv); // 输出: 'prod'(没找到的话是undefined)
写法2:找所有匹配的环境名
// 用filter筛选所有符合条件的,再map提取环境名 const allMatchingEnvs = Object.entries(environments) .filter(([key, info]) => info.targetName === 'bob') .map(([key]) => key); console.log(allMatchingEnvs); // 输出: ['prod']
这样不管用Underscore还是原生JS,都能正确处理嵌套对象的查找问题啦~
内容的提问来源于stack exchange,提问作者Illusionist
相关产品推荐
相关产品推荐

