检查JavaScript对象中的多个键?

检查JavaScript对象中的多个键?,javascript,lodash,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} } 我想检查一下它是否有不同的按键,如果有办法的话 co

是否有用于同时检查多个键的本机函数或库函数

假设这是我的目标:

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']);
我也知道我可以自己写,但我希望尽可能避免,因为它仍然会让人觉得过于冗长,需要写出完整的公式

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

但是我不想每次都写出
hasOwnProperty
,我可能希望提供我的键列表作为它自己的变量。

您可以使用两个函数,一个用于检查路径,另一个用于检查对象中是否有所有键

函数具有(对象、路径){
返回path.split('.').every(k=>object.hasOwnProperty(k)&&(object=object[k]);
}
函数具有多个键(对象、键){
返回key.every(has.bind(null,object));
}
const foo={};
foo.superlongNameneedByPackage={cat:{black:1},hat:2,bat:3,mat:12};
const isReadyForHalloween=拥有多个钥匙(foo.superlongNameneedbypackage,['cat.black','hat','bat']);

console.log(万圣节准备就绪)尽管lodash没有内置函数,但您可以使用
创建
hasMultipleKeys()

该函数获取键数组和要检查的对象。数组直接传递给
..each()
(通过
..identity()
),而对象应用于
..has()
(使用
..curry()
)为
..each()
函数创建谓词

const hasMultipleKeys=..overArgs(..every,[..identity,..curry(..has)])
const-foo={cat:{black:1},hat:2,bat:3,mat:12}
console.log(haspultiplekeys(['cat.black','hat','bat'],foo))//true
console.log(haspultiplekeys(['cat.black','nothing','bat'],foo))//false

几天前我有一个完全相同的问题。这就是我遇到的。它使用扁平封装

以下是我的解决方案:

> 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

没有那样的内置功能。您可以制作自定义函数或使用第三方函数,正如您所提到的-它应该很简单,如果您在许多地方需要它,它最终会节省您的时间和精力。您可以使用
的每一个
都有
您可以使用扁平化npm包,它允许您扁平化对象,它将转换为
cat.black
> 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