如何使用Lodash的_.get方法测试多路径并批量处理下拉框的datapath属性
优化方案:批量处理多个下拉框的Lodash路径获取
我来帮你梳理下这个问题的优化思路——核心就是复用重复逻辑+批量遍历处理,既解决「测试多个路径」的需求,又能一次性处理所有三个下拉框,咱们一步步来:
1. 先封装复用的路径获取工具函数
你原来的代码里,每个下拉框都要写两次_.get:先试原路径,找不到再试common.xxx的路径。咱们把这个逻辑抽成一个工具函数,避免重复代码,以后要加更多 fallback 路径也方便修改:
// 专门处理「原路径→common前缀路径」的 fallback 逻辑 const getPathWithFallback = (state, basePath) => { const directValue = _.get(state, basePath); // 如果原路径有值就返回,否则尝试common前缀的路径 return directValue != null ? directValue : _.get(state, `common.${basePath}`); }; // 如果以后需要支持更多路径(比如再加个`global.xxx`),可以改成接受路径数组: const getFirstValidPath = (state, paths, defaultValue = null) => { return _.reduce(paths, (result, path) => { // 找到第一个非null/undefined的值就返回 return result != null ? result : _.get(state, path); }, defaultValue); };
2. 批量遍历所有下拉框
接下来用Lodash的_.mapValues来遍历你的dropdownList对象,对每个下拉框自动执行原来的逻辑,不用再手动写dropdown1、dropdown2的重复代码:
const mapStateToProps = (state, ownProps) => { const { dropdownList } = ownProps; // 遍历所有下拉框,生成每个下拉框对应的data和options const dropdownResults = _.mapValues(dropdownList, (dropdownItem) => { // 处理data:先试datapath,找不到就试common.datapath const data = getPathWithFallback(state, dropdownItem.datapath); // 处理options:先试datapathRead→common.datapathRead→默认值 const options = getFirstValidPath(state, [ dropdownItem.datapathRead, `common.${dropdownItem.datapathRead}` ], { key: "key", value: "value", text: "text" }); return { data, options }; }); // 最后按你的需求返回结果,比如把data和options分开成对象,或者直接返回dropdownResults return { // 所有下拉框的data,键是dropdown1/dropdown2/dropdown3 dropdownData: _.mapValues(dropdownResults, res => res.data), // 所有下拉框的options dropdownOptions: _.mapValues(dropdownResults, res => res.options) }; };
关于「用_.get测试多个路径」的补充
如果只是单纯想从多个路径里取第一个存在的值,除了上面的工具函数,也可以用_.find先定位存在的路径,再用_.get取值:
const targetPaths = [pathA, pathB, pathC]; // 先找到第一个存在的路径 const existingPath = _.find(targetPaths, path => _.has(state, path)); // 取值,找不到就用默认值 const value = existingPath ? _.get(state, existingPath) : defaultValue;
这种方式适合路径数量较多的场景,先判断路径是否存在再取值,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

