检查对象是否包含数组中的所有键

11

如何最简洁地检查一个对象是否包含数组中指定的所有键?

例如:

var arr = ["foo", "bar"];

var obj = {
  foo: 1,
  bar: "hello"
};

magic_function(arr, obj); // return true, all keys from array exist


var obj2 = {
  foo: 12,
  bar: "hi",
  test: "hey"
};

magic_function(arr, obj2); // return true, all keys from array exist,
                           // keys not specified in array don't matter


var obj3 = {
  foo: 5
};

magic_function(arr, obj3); // return false, "bar" is missing

magic_function在哪里? - Satpal
4
那是OP所询问的。 - Praveen Kumar Purushothaman
6
还有一个代码服务? - kind user
3
@PraveenKumar,我在怂恿OP至少分享伪代码。因为他已经问了70多个问题,而不仅仅是请求完整的代码。完全同意_K. Daniek_的评论。 - Satpal
3个回答

31
这应该可以做到:


const arr = ["foo", "bar"];

const obj = {
  foo: 1,
  bar: "hello"
};

const hasAllKeys = arr.every(item => obj.hasOwnProperty(item));

console.log(hasAllKeys);

Array.prototype.every() 方法会对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true
Object.prototype.hasOwnProperty() 方法用来判断一个对象是否含有特定的自身属性。


如果 obj 还有 baz = 'test',这将失败-因此键和数组完全匹配并不包容。 - Matt Fletcher
@MattFletcher:这段代码仅检查数组中的所有键是否存在于对象中。它不关心额外的键,因为原始问题明确表明这是一个要求。这从来就不是一个完美的一对一匹配。 - Cerbrus
我知道,只是觉得对于其他正在寻找精确键匹配的人来说,我想强调一下。 - Matt Fletcher

9
您可以遍历数组并使用 in 运算符 检查键是否存在。

in 运算符会返回一个布尔值,指示指定的属性是否在指定的对象或其原型链中。

in 运算符和 Object#hasOwnProperty 的区别在于,in 会检查所有属性,包括原型链上的属性,例如 toString(如示例中所示),而 Object#hasOwnProperty 只检查自有属性,不包括原型链上的属性。

function checkKeys(keys, object) {
    return keys.every(function (key) {
        return key in object;
    });
}

function checkOwnKeys(keys, object) {
    return keys.every(function (key) {
        return object.hasOwnProperty(key);
    });
}

var arr = ["foo", "bar", "toString"],
    obj = { foo: 1, bar: "hello" };

console.log(checkKeys(arr, obj));                // true
console.log(checkOwnKeys(arr, obj));             // false
console.log(checkOwnKeys(["foo", "bar"], obj));  // true


我认为提到inhasOwnProperty之间的区别会很有用。具体来说:“in运算符对于原型链中的属性返回true。”尽管如此,这仍然是一个有效的答案。 - Cerbrus

0
我们可以通过以下方式进行检查。

const arr = ["foo", "bar"];

const obj = {
  foo: 1,
  bar: "hello"
};

const hasAllKeys = label => Object.prototype.hasOwnProperty.call(obj, label);

console.log(arr.every(item => hasAllKeys(item)));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接