
本文介绍如何遍历 javascript 对象,精准筛选出值等于目标值的键值对,并将其以对象形式存入新数组,避免常见误操作(如错误地推入整个对象)。
在实际开发中,我们常需根据值(value)反向查找对象中匹配的键(key),并将这些键值对结构化地收集到数组中。例如,给定一个记录人物胸围尺寸的对象,我们希望提取所有胸围为 36 的人名及其尺寸,组成一个对象数组。
原代码存在两个关键问题:
- 循环中错误地 push(chestSize) —— 每次匹配都把整个源对象推入数组,导致结果冗余且不符合预期;
- 未正确提取匹配的键 —— 即使条件成立,也未将当前 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 最佳实践,适用于任何键值对筛选场景。










