提取对象中所有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() 方案

  • 边界情况处理:需要考虑空对象、所有值都不满足条件等边界情况