如何从对象中提取指定值对应的所有键并构建成新数组

2次阅读

如何从对象中提取指定值对应的所有键并构建成新数组

本文介绍如何遍历 javascript 对象,精准筛选出值等于目标值的键值对,并将其以对象形式存入新数组,避免常见误操作(如错误地推入整个对象)。

在实际开发中,我们常需根据值(value)反向查找对象中匹配的键(key),并将这些键值对结构化地收集到数组中。例如,给定一个记录人物胸围尺寸的对象,我们希望提取所有胸围为 36 的人名及其尺寸,组成一个对象数组。

原代码存在两个关键问题:

  1. 循环中错误地 push(chestSize) —— 每次匹配都把整个源对象推入数组,导致结果冗余且不符合预期;
  2. 未正确提取匹配的键 —— 即使条件成立,也未将当前 key 或 {[key]: value} 结构加入数组。

✅ 正确做法是结合 Object.entries()、Filter() 和 map() 链式调用,语义清晰、函数式风格强、无副作用:

const chestSize = {   "Leanne": 30,   "Denise": 26,   "Carol": 36,   "Jill": 28,   "Randy": 32 };  const chestSizeThirtySix = Object.entries(chestSize)   .filter(([key, value]) => value === 36)     // 筛选值为 36 的条目   .map(([key, value]) => ({ [key]: value })); // 转换为单键对象:{ "Carol": 36 }  console.log(chestSizeThirtySix); // 输出: [{ "Carol": 36 }]

? 注意事项

  • 若需仅获取匹配的键名字符串(如 [“Carol”]),可将 map 改为 .map(([key]) => key);
  • 若需获取所有匹配键名组成的数组(支持多匹配场景),此方案天然支持——例如将 36 改为 28,会返回 [{“Jill”: 28}];若多个键值相同(如新增 “Amy”: 36),结果自动包含两者;
  • Object.entries() 返回 [key, value] 数组,解构赋值 ([key, value]) 是安全且推荐的写法;
  • 始终优先使用 === 进行严格相等判断,避免类型隐式转换引发意外。

? 扩展建议封装为可复用函数,提升灵活性:

const getEntriesByValue = (obj, targetValue) =>   Object.entries(obj)     .filter(([, value]) => value === targetValue)     .map(([key, value]) => ({ [key]: value }));  // 使用示例 console.log(getEntriesByValue(chestSize, 32)); // [{ "Randy": 32 }]

该方法简洁、健壮、符合现代 javaScript 最佳实践,适用于任何键值对筛选场景。

text=ZqhQzanResources