检查JavaScript对象中的多个键?

时间:2019-09-30 11:31:17

标签: javascript lodash

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

说这是我的对象

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']);

我知道lodash's has以及我可以编写自己的using Object.keys and every的事实,但是我希望尽可能避免使用它,因为它仍然会显得太冗长,需要写出完整的配方。

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

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

4 个答案:

答案 0 :(得分:1)

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

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);

答案 1 :(得分:1)

尽管lodash没有内置功能,但是您可以使用hasMultipleKeys()创建_.overArgs()

该函数采用键数组和要检查的对象。将该数组直接传递给_.every()(通过_.identity()),同时将该对象应用于_.has()(使用_.curry())来创建_.every()的谓词功能。

const hasMultipleKeys = _.overArgs(_.every, [_.identity, _.curry(_.has)])


const foo = {cat: {black: 1}, hat: 2, bat:3, mat: 12}
  
console.log(hasMultipleKeys(['cat.black', 'hat', 'bat'], foo)) // true
console.log(hasMultipleKeys(['cat.black', 'nothing', 'bat'], foo)) // false
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

答案 2 :(得分:0)

几天前,我有完全相同的问题。这就是我遇到的。它使用扁平包装。 https://www.npmjs.com/package/flat

      let foo;
      const obj = flatten(clonedObj, {maxDepth: 0});
      foo = ['yourkeys', 'yourkeys.secondLevel']
        .every(field => obj.hasOwnProperty(field) && !!obj[field]);

答案 3 :(得分:0)

这是我的解决方案:

> const objectContains = (object, keys) => keys.every(k => k in object)
> const o = { a: 0, b: 1 }
> objectContains(o, ['a', 'b'])
true
> objectContains(o, ['a', 'b', 'c'])
false