如何过滤对象获取符合条件的ID数组?含Lodash方案咨询
解决方案:过滤对象并返回符合条件的ID数组
嘿,这个需求太典型了——咱们都知道Array.prototype.filter是数组专属的方法,但你这里的entities是个以ID为键的普通对象,直接用肯定不行。不过不管用不用工具库,都有很顺手的实现方式,我给你拆解一下:
原生JavaScript实现(无需额外依赖)
完全不用引入任何库,用原生API就能搞定,核心思路是先把对象的键转成数组,再过滤筛选:
const entities = { 1: {'name': 'Fred', 'age': 35}, 2: {'name': 'Hans', 'age': 47}, 3: {'name': 'Bert', 'age': 27} }; // 步骤分解: // 1. 拿到所有对象键的数组(默认是字符串类型) // 2. 过滤出对应age>30的键 // 3. 可选:把字符串ID转成数字类型 const ids = Object.keys(entities) .filter(id => entities[id].age > 30) .map(Number); console.log(ids); // 输出:[1, 2]
如果不需要数字类型的ID,去掉最后的.map(Number)就行,会得到['1', '2']这样的字符串数组。
使用Lodash的便捷实现
如果你已经在用Lodash,那有几种更简洁的写法,可读性也很高:
写法一:用_.pickBy先筛选对象,再取键
这种方式逻辑最直观:先挑出所有age>30的对象,再提取它们的ID:
const filteredEntities = _.pickBy(entities, person => person.age > 30); const ids = _.keys(filteredEntities).map(Number);
写法二:直接组合_.keys和_.filter
和原生写法思路类似,只是用Lodash的函数替代原生API:
const ids = _.filter(_.keys(entities), id => entities[id].age > 30).map(Number);
写法三:用_.entries解构处理
如果想一次性拿到ID和对应对象,可以用_.entries把对象转成[键, 值]的数组,再过滤提取:
const ids = _.map( _.filter(_.entries(entities), ([id, person]) => person.age > 30), ([id]) => Number(id) );
不管哪种写法,最终都能得到你想要的[1, 2]数组~
内容的提问来源于stack exchange,提问作者Wolf359
相关产品推荐
相关产品推荐

