首页 > 解决方案 > 检查 JavaScript 对象中的多个键?

问题描述

是否有用于一次检查多个键的本机或库函数?

说这是我的对象:

const foo = {};
foo.superLongNameNeededByPackage = {cat: {black: 1}, hat: 2, bat:3, mat: 12}
console.log(foo);
// { superLongNameNeededByPackage : {cat: {black: 1}, hat: 2, bat:3, mat: 12} }

我想检查它上面是否有各种键,如果有办法做到这一点?

const isReadyForHalloween = hasMultipleKeys(foo.superLongNameNeededByPackage,
  ['cat.black', 'hat', 'bat']);

我知道lodashhas以及我可以编写自己的使用的事实Object.keysevery但我希望尽可能避免它,因为它仍然会感觉过于冗长并且需要写出完整的公式。

const arr = Object.keys(foo.superLongNameNeededByPackage);
arr.every(item => item.hasOwnProperty("a")
               && item.hasOwnProperty("b")
               && item.hasOwnProperty("c") );

但我不想hasOwnProperty每次都写出来,可能想提供我的密钥列表作为它自己的变量。

标签: javascriptlodash

解决方案


您可以采用两个功能,一个检查路径,另一个检查是否所有键都在对象中。

function has(object, path) {
    return path.split('.').every(k => object.hasOwnProperty(k) && (object = object[k]));
}

function hasMultipleKeys(object, keys) {
    return keys.every(has.bind(null, object));
}

const foo = {};

foo.superLongNameNeededByPackage = { cat: { black: 1 }, hat: 2, bat: 3, mat: 12 };

const isReadyForHalloween = hasMultipleKeys(foo.superLongNameNeededByPackage,  ['cat.black', 'hat', 'bat']);
console.log(isReadyForHalloween);


推荐阅读