如何使用Lodash pickBy过滤含嵌套分类的对象?
用Lodash ^4.17.10过滤对象的正确姿势
首先我猜你的数据结构大概是类似这样的——一个以字符串为键的对象,每个值都包含category嵌套属性:
const yourObject = { "1": { name: "普通商品", category: { slug: "other-category" } }, "2": { name: "显卡", category: { slug: "graphic-card" } }, "3": { name: "外设配件", category: { slug: "accessory" } } };
你之前的代码没返回结果,大概率是直接用_.filter处理对象了——但Lodash的_.filter默认是给数组设计的,直接处理对象不会按预期遍历所有键值对。下面给你两种适配4.17.10版本的正确实现方式:
方式一:用_.pickBy(最简洁直接)
_.pickBy是专门用来过滤对象的方法,会保留所有回调返回true的键值对,完美匹配你的需求:
const _ = require('lodash'); // 安全版:用_.get避免嵌套属性不存在时报错 const filteredResult = _.pickBy(yourObject, (value, key) => { return key === "2" && _.get(value, 'category.slug') === "graphic-card"; }); // 如果你能确保所有数据项都有category属性,可以简化成: // const filteredResult = _.pickBy(yourObject, (value, key) => { // return key === "2" && value.category.slug === "graphic-card"; // });
执行后filteredResult就是只包含键"2"且符合category条件的对象;如果没匹配到任何结果,会返回空对象{}。
方式二:先转数组再过滤(适合复杂逻辑场景)
如果后续需要扩展更复杂的过滤规则,可以先把对象转成键值对数组,过滤后再转回对象:
// 把对象转换为[[key, value]]格式的数组 const objectEntries = _.entries(yourObject); // 过滤符合条件的键值对 const matchedEntries = _.filter(objectEntries, ([key, value]) => { return key === "2" && _.get(value, 'category.slug') === "graphic-card"; }); // 把过滤后的数组转回对象 const filteredResult = _.fromPairs(matchedEntries);
额外小技巧:单个目标键的快速判断
如果你确定键"2"一定存在,也可以直接检查它的属性后提取结果:
const targetItem = yourObject["2"]; const filteredResult = targetItem && _.get(targetItem, 'category.slug') === "graphic-card" ? { "2": targetItem } : {};
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

