hasOwnProperty 有多个 属性
hasOwnProperty with more than one property
我试图发现一个对象是否具有某些属性,但我在使用 hasOwnProperty 方法时遇到了问题。
我在数组上使用该方法(我知道文档说明了一个字符串)。
下一行 return 正确:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);
这一行 return 也是正确的:
{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
但是这个 return 是错误的:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
我需要它 return 为真。我正在使用 Object.keys(object) 来获取我正在使用的属性,它 return 是一个数组,所以我需要在 hasOWnProperty 上使用一个数组。
我是否遗漏了一些理论概念?有什么办法可以解决这个问题吗?
如果要查看对象自身的属性,可以使用Object.getOwnPropertyNames
方法。它 returns 直接在给定对象上找到的所有属性(包括不可枚举的属性,使用 Symbol 的属性除外)的数组。
let o = { "a": 1, "b": 2 };
Object.getOwnPropertyNames(o).forEach(k => console.log(`key: ${k}, value: ${o[k]}`));
首先,就让您的第三个片段 return 为真而言,我认为这是不可能的。您最好的办法是单独检查每个 属性:
const obj = { "a": 1, "b": 2 };
console.log(["a", "b"].every(p => obj.hasOwnProperty(p)))
哪个应该给你你想要的。
但要理解为什么前两个 return 为真,而第三个为假:
hasOwnProperty
方法只接受一个参数(忽略其他参数),并且它希望该参数是一个字符串。如果参数不是字符串,那么 JavaScript 将尝试将其强制转换为一个(通常使用 .toString
方法)。
所以你的前两个片段是等价的,因为:
["a"].toString() === "a"
,所以hasOwnProperty(["a"])
等同于hasOwnProperty("a")
参数转换为字符串后
然后在你的第二个片段中,第二个参数 "b"
被简单地忽略,让它再次等同于 hasOwnProperty("a")
。
最后,您的第三个代码段使用 ["a", "b"]
和 ["a", "b"].toString() === "a,b"
,这不是您对象的 属性。
您可以通过这样的 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]);
}
}
根据文档,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);
这里发生了两件事。
首先,hasOwnProperty
只接受一个参数。所以它会忽略你传递给它的任何其他参数。
其次,(我在这里稍微简化)它将第一个参数转换为 String,然后 then 检查查看对象是否具有 属性.
让我们看看您的测试用例:
原因 { "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
returns true
是因为它忽略了第二个参数。所以实际上它只是检查 "a".
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
returns false
因为第一个参数 ["a", "b"]
被转换为 "a,b"
,并且没有 { "a": 1, "b": 2 }["a,b"]
。
要找出给定对象是否具有数组中的 所有 属性,您可以遍历数组并检查每个 属性,如下所示:
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));
我希望这有助于澄清事情。祝你好运!
所以这是一个老问题,我有点惊讶没有其他人想过写它,但这通常可以使用数组上的 .every
来解决。所以对于原来的问题,代码应该是这样的:
["a", "b"].every((item) => ({ "a": 1, "b": 2 }.hasOwnProperty(item)))
这将 return 一个简单的 true。
数组 .every
将为数组中的每个项目 运行 一个条件,并且仅当所有项目的条件都为真时 return 为真。
参见 the the mozilla web docs
我试图发现一个对象是否具有某些属性,但我在使用 hasOwnProperty 方法时遇到了问题。
我在数组上使用该方法(我知道文档说明了一个字符串)。
下一行 return 正确:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);
这一行 return 也是正确的:
{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
但是这个 return 是错误的:
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
我需要它 return 为真。我正在使用 Object.keys(object) 来获取我正在使用的属性,它 return 是一个数组,所以我需要在 hasOWnProperty 上使用一个数组。
我是否遗漏了一些理论概念?有什么办法可以解决这个问题吗?
如果要查看对象自身的属性,可以使用Object.getOwnPropertyNames
方法。它 returns 直接在给定对象上找到的所有属性(包括不可枚举的属性,使用 Symbol 的属性除外)的数组。
let o = { "a": 1, "b": 2 };
Object.getOwnPropertyNames(o).forEach(k => console.log(`key: ${k}, value: ${o[k]}`));
首先,就让您的第三个片段 return 为真而言,我认为这是不可能的。您最好的办法是单独检查每个 属性:
const obj = { "a": 1, "b": 2 };
console.log(["a", "b"].every(p => obj.hasOwnProperty(p)))
哪个应该给你你想要的。
但要理解为什么前两个 return 为真,而第三个为假:
hasOwnProperty
方法只接受一个参数(忽略其他参数),并且它希望该参数是一个字符串。如果参数不是字符串,那么 JavaScript 将尝试将其强制转换为一个(通常使用 .toString
方法)。
所以你的前两个片段是等价的,因为:
["a"].toString() === "a"
,所以hasOwnProperty(["a"])
等同于hasOwnProperty("a")
参数转换为字符串后
然后在你的第二个片段中,第二个参数 "b"
被简单地忽略,让它再次等同于 hasOwnProperty("a")
。
最后,您的第三个代码段使用 ["a", "b"]
和 ["a", "b"].toString() === "a,b"
,这不是您对象的 属性。
您可以通过这样的 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]);
}
}
根据文档,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);
这里发生了两件事。
首先,hasOwnProperty
只接受一个参数。所以它会忽略你传递给它的任何其他参数。
其次,(我在这里稍微简化)它将第一个参数转换为 String,然后 then 检查查看对象是否具有 属性.
让我们看看您的测试用例:
原因 { "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
returns true
是因为它忽略了第二个参数。所以实际上它只是检查 "a".
{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
returns false
因为第一个参数 ["a", "b"]
被转换为 "a,b"
,并且没有 { "a": 1, "b": 2 }["a,b"]
。
要找出给定对象是否具有数组中的 所有 属性,您可以遍历数组并检查每个 属性,如下所示:
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));
我希望这有助于澄清事情。祝你好运!
所以这是一个老问题,我有点惊讶没有其他人想过写它,但这通常可以使用数组上的 .every
来解决。所以对于原来的问题,代码应该是这样的:
["a", "b"].every((item) => ({ "a": 1, "b": 2 }.hasOwnProperty(item)))
这将 return 一个简单的 true。
数组 .every
将为数组中的每个项目 运行 一个条件,并且仅当所有项目的条件都为真时 return 为真。
参见 the the mozilla web docs