提取对象中所有value大于2的键值对
实现一个方法,从对象中筛选出值大于2的键值对,并返回新对象
问题
给定一个对象,需要设计一个方法来提取其中所有值(value)大于2的键值对,并返回一个新的对象。这个问题考察了对象遍历、条件筛选以及对象操作的基本能力。
解答
/**
* 提取对象中所有value大于2的键值对
* @param {Object} obj - 源对象
* @returns {Object} - 包含所有value大于2的新对象
*/
function filterObjectByValue(obj) {
// 方法1: 使用 Object.entries + reduce
return Object.entries(obj).reduce((result, [key, value]) => {
if (value > 2) {
result[key] = value;
}
return result;
}, {});
}
// 方法2: 使用 for...in 循环
function filterObjectByValue2(obj) {
const result = {};
for (let key in obj) {
// 只处理对象自身的属性,不包括原型链上的属性
if (obj.hasOwnProperty(key) && obj[key] > 2) {
result[key] = obj[key];
}
}
return result;
}
// 方法3: 使用 Object.keys + forEach
function filterObjectByValue3(obj) {
const result = {};
Object.keys(obj).forEach(key => {
if (obj[key] > 2) {
result[key] = obj[key];
}
});
return result;
}
// 方法4: 使用 Object.fromEntries (ES2019+)
function filterObjectByValue4(obj) {
return Object.fromEntries(
Object.entries(obj).filter(([key, value]) => value > 2)
);
}
使用示例
// 示例1: 基本使用
const obj1 = {
a: 1,
b: 3,
c: 2,
d: 5,
e: 0
};
console.log(filterObjectByValue(obj1));
// 输出: { b: 3, d: 5 }
// 示例2: 包含负数
const obj2 = {
x: -1,
y: 4,
z: 2.5,
w: 2
};
console.log(filterObjectByValue(obj2));
// 输出: { y: 4, z: 2.5 }
// 示例3: 空对象
const obj3 = {};
console.log(filterObjectByValue(obj3));
// 输出: {}
// 示例4: 所有值都小于等于2
const obj4 = {
a: 1,
b: 2,
c: 0
};
console.log(filterObjectByValue(obj4));
// 输出: {}
// 示例5: 包含小数
const obj5 = {
price1: 1.5,
price2: 2.1,
price3: 3.8,
price4: 2.0
};
console.log(filterObjectByValue(obj5));
// 输出: { price2: 2.1, price3: 3.8 }
关键点
-
对象遍历方式:可以使用
Object.entries()、Object.keys()、for...in等多种方式遍历对象 -
条件筛选:使用简单的数值比较
value > 2来判断是否保留该键值对 -
创建新对象:不修改原对象,而是创建并返回一个新对象,符合函数式编程的不可变性原则
-
hasOwnProperty 检查:使用
for...in时需要通过hasOwnProperty()确保只处理对象自身的属性 -
现代化方案:
Object.fromEntries()配合filter()是最简洁优雅的实现方式(需要 ES2019+ 支持) -
性能考虑:对于大对象,
for...in循环通常性能最好;对于小对象,可读性更重要,推荐使用Object.fromEntries()方案 -
边界情况处理:需要考虑空对象、所有值都不满足条件等边界情况
目录