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

10次阅读

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

本文介绍如何遍历 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