如何检查一个对象是否包含一组属性
How to check an object contains a set of properties
首先我要说,我知道有很多方法可以做到这一点。这个问题是为了比较不同的版本。
我也知道我们希望 SO 成为 QA 网站,而不是 QAAAAAAA... 网站。
所以我会细化这个问题,让它更有针对性,最后得到一个答案。
给定一个对象:
var obj = {a: 1, b: 2, c: 3};
查看是否存在以下键:
var keys = ['a', 'b', 'c', 'd']; // 'd' would be flagged although a boolean would suffice
理想情况下,我想在 ES5 中执行此操作,但 ES6 非常受欢迎。
理想情况下不使用 lodash,但它非常受欢迎。
我确信本机 Array 方法的完美组合会起作用:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
目标是拥有一个小而简洁的函数或代码行,而不是像这样的东西:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
var found = keys.length;
for (var i = 0; i < keys.length; i++) {
if (obj.hasOwnProperty(keys[i])) {
found--;
}
}
console.log("Missing:", found);
我将参与第一个产品:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
var allPresent = Object.keys(obj).filter(function(item) {
return keys.indexOf(item) !== -1;
}).length === keys.length;
console.log("All present:", allPresent);
给定对象:
var obj = {a: 1, b: 2, c: 3},
keys = ['a','b'];
您可以使用以下方法检查它是否包含密钥 'a':
Object.keys( obj ).indexOf('a') !== -1
感谢您的评论,这里是检查 OP 要求完全平等的完整答案:
JSON.stringify( Object.keys( obj ) ) === JSON.stringify( keys )
或部分相等
JSON.stringify( Object.keys( obj ) ).indexOf( JSON.stringify( keys ) ) !== -1
像这样:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
alert(keys.every(Object.prototype.hasOwnProperty, obj))
allPresent = keys.reduce(function ( acc, next ) {
return !acc || obj.hasOwnProperty(next);
}, true);
尽管 Amits 的答案可能更小并且更适合支持 'every' 的浏览器。 (现在应该都是)
首先我要说,我知道有很多方法可以做到这一点。这个问题是为了比较不同的版本。
我也知道我们希望 SO 成为 QA 网站,而不是 QAAAAAAA... 网站。
所以我会细化这个问题,让它更有针对性,最后得到一个答案。
给定一个对象:
var obj = {a: 1, b: 2, c: 3};
查看是否存在以下键:
var keys = ['a', 'b', 'c', 'd']; // 'd' would be flagged although a boolean would suffice
理想情况下,我想在 ES5 中执行此操作,但 ES6 非常受欢迎。
理想情况下不使用 lodash,但它非常受欢迎。
我确信本机 Array 方法的完美组合会起作用:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
目标是拥有一个小而简洁的函数或代码行,而不是像这样的东西:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
var found = keys.length;
for (var i = 0; i < keys.length; i++) {
if (obj.hasOwnProperty(keys[i])) {
found--;
}
}
console.log("Missing:", found);
我将参与第一个产品:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
var allPresent = Object.keys(obj).filter(function(item) {
return keys.indexOf(item) !== -1;
}).length === keys.length;
console.log("All present:", allPresent);
给定对象:
var obj = {a: 1, b: 2, c: 3},
keys = ['a','b'];
您可以使用以下方法检查它是否包含密钥 'a':
Object.keys( obj ).indexOf('a') !== -1
感谢您的评论,这里是检查 OP 要求完全平等的完整答案:
JSON.stringify( Object.keys( obj ) ) === JSON.stringify( keys )
或部分相等
JSON.stringify( Object.keys( obj ) ).indexOf( JSON.stringify( keys ) ) !== -1
像这样:
var obj = {a: 1, b: 2, c: 3};
var keys = ['a', 'b', 'c', 'd'];
alert(keys.every(Object.prototype.hasOwnProperty, obj))
allPresent = keys.reduce(function ( acc, next ) {
return !acc || obj.hasOwnProperty(next);
}, true);
尽管 Amits 的答案可能更小并且更适合支持 'every' 的浏览器。 (现在应该都是)