我正在尝试发现某个对象是否有某些属性,而我在使用hasOwnProperty方法时遇到了问题。
我在数组上使用该方法(我知道文档声明了一个字符串)。
以下行返回true:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);
此行也返回true:
{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
但是这个返回false:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
我需要它才能回归真实。我正在使用Object.keys(object)来获取我正在使用的属性,它返回一个数组,所以我需要在hasOWnProperty上使用一个数组。
我缺少一些理论概念吗?有没有办法解决这个问题?
答案 0 :(得分:3)
这里有两件事。
首先,hasOwnProperty
只接受一个参数。所以它会忽略你传递给它的任何其他论据。
其次,(我在这里稍微简化)它会将第一个参数转换为 String ,然后然后检查对象是否具有该属性
让我们来看看你的测试用例:
{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
返回true
的原因是因为忽略了第二个参数。所以真的只是检查“a”。
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
会返回false
,因为第一个参数["a", "b"]
会转换为"a,b"
,而且没有{ "a": 1, "b": 2 }["a,b"]
。
要确定给定对象是否具有 all 数组中的属性,您可以遍历数组并检查每个属性,如下所示:
function hasAllProperties(obj, props) {
for (var i = 0; i < props.length; i++) {
if (!obj.hasOwnProperty(props[i]))
return false;
}
return true;
}
或者,如果您感觉很花哨,可以使用every
函数隐式执行此操作:
var props = ["a", "b"];
var obj = { "a": 1, "b": 2 };
var hasAll = props.every(prop => obj.hasOwnProperty(prop));
我希望这有助于澄清事情。祝你好运!
答案 1 :(得分:1)
如果要检查对象的属性,可以使用Object.getOwnPropertyNames
方法。它返回一个直接在给定对象上找到的所有属性的数组(包括除了使用Symbol的非可枚举属性)。
let o = { "a": 1, "b": 2 };
Object.getOwnPropertyNames(o).forEach(k => console.log(`key: ${k}, value: ${o[k]}`));
&#13;
答案 2 :(得分:1)
首先,就让你的第三个片段返回真实而言,我认为这是不可能的。你能做的最好的事情就是分别检查每个房产:
const obj = { "a": 1, "b": 2 };
console.log(["a", "b"].every(p => obj.hasOwnProperty(p)))
哪个可以给你你想要的东西。
但要理解为什么前两个返回true,但第三个为false:
hasOwnProperty
方法只接受一个参数(忽略其他参数),并且它希望该参数是一个字符串。如果参数不是字符串,那么javascript将尝试将其强制转换为一个字符串(通常使用.toString
方法)。
所以你的前两个片段是等价的,因为:
["a"].toString() === "a"
,因此在将参数转换为字符串后,hasOwnProperty(["a"])
与hasOwnProperty("a")
相同。
然后在你的第二个片段中,第二个参数"b"
被忽略,再次只与hasOwnProperty("a")
等效。
最后,您的第三个代码段使用["a", "b"]
和["a", "b"].toString() === "a,b"
,这不是您对象的属性。
答案 3 :(得分:1)
鉴于文档,似乎hasOwnProperty()
方法将字符串或符号作为参数。所以我认为hasOwnProperty()
无法获取字符串集合并测试对象是否将每个字符串都作为属性。
我认为另一种方法是获取字符串数组并遍历每一个字符串。然后,对于数组中的每个字符串(要测试的属性),可以测试对象是否具有该属性。这是一个例子:
const o = new Object();
var propsToTest = ['a', 'b'];
o.a = 42;
o.b = 40;
var hasProperties = true;
propsToTest.forEach(function(element) { // For each "property" in propsToTest, verify that o hasOwnProperty
if(!o.hasOwnProperty(element))
hasProperties = false;
});
console.log(hasProperties);
答案 4 :(得分:0)
您可以使用for...in
循环实现此目标
const obj = { "a": 1, "b": 2 };
for (key in obj) {
if (obj.hasOwnProperty(key)) {
console.log('has', key, obj[key]);
} else {
console.log('not', key, obj[key]);
}
}