Skip to content

检查JavaScript对象是否具有给定的值或键

在使用纯JavaScript对象时,您经常需要检查值或键是否存在。虽然对象的JavaScript API不如数组丰富,但它仍然提供了一些方法来帮助您完成此任务。

检查对象是否具有给定的值

为了检查对象是否具有给定的值,您可以使用Object.values()获取对象的所有值。然后,使用Array.prototype.includes()检查目标值是否包含在值数组中。

const hasValue = (obj, value) => Object.values(obj).includes(value);

const obj = { a: 100, b: 200 };
hasValue(obj, 100); // true
hasValue(obj, 999); // false

检查对象是否具有给定的键

使用Object.keys()而不是Object.values()同样容易检查对象是否具有给定的键。然后,您可以使用Array.prototype.includes()检查目标键是否包含在键数组中。

const hasKey = (obj, key) => Object.keys(obj).includes(key);

const obj = { a: 100, b: 200 };
hasKey(obj, 'a'); // true
hasKey(obj, 'c'); // false

嵌套键的计算

检查嵌套键稍微复杂一些,但可以通过一些巧妙的方法来实现。

给定一个键的数组,你可以使用Array.prototype.every()来顺序检查对象的内部深度的键。使用Object.prototype.hasOwnProperty(),你可以检查对象是否没有当前键或不是一个对象,停止传播并返回false。否则,将键的值分配给对象,以在下一次迭代中使用。

const hasKeyDeep = (obj, keys) => {
  return (
    keys.length > 0 &&
    keys.every(key => {
      if (typeof obj !== 'object' || !obj.hasOwnProperty(key)) return false;
      obj = obj[key];
      return true;
    })
  );
};

let obj = {
  a: 1,
  b: { c: 4 },
  'b.d': 5
};
hasKeyDeep(obj, ['a']); // true
hasKeyDeep(obj, ['b']); // true
hasKeyDeep(obj, ['b', 'c']); // true
hasKeyDeep(obj, ['b.d']); // true
hasKeyDeep(obj, ['d']); // false
hasKeyDeep(obj, ['c']); // false
hasKeyDeep(obj, ['b', 'f']); // false