检查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