如何检查JavaScript对象或数组中是否存在特定键?
如果某个密钥不存在,并且我尝试访问它,它会返回false吗?或抛出错误?
检查undefined-ness不是测试密钥是否存在的准确方法.如果密钥存在但值实际上undefined
怎么办?
var obj = { key: undefined }; obj["key"] !== undefined // false, but the key exists!
您应该使用in
运算符:
"key" in obj // true, regardless of the actual value
如果要检查密钥是否不存在,请记住使用括号:
!("key" in obj) // true if "key" doesn't exist in object !"key" in obj // ERROR! Equivalent to "false in obj"
或者,如果要特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty
:
obj.hasOwnProperty("key") // true
对于那些方法之间的性能比较in
,hasOwnProperty
以及关键的是undefined
,看到这个标杆
如何检查JavaScript对象或数组中是否存在特定键?如果某个密钥不存在而我尝试访问它,它会返回false吗?或抛出错误?
使用(关联)数组样式或对象样式直接访问缺少的属性将返回未定义的常量.
正如人们在这里已经提到的那样,你可以拥有一个具有与"未定义"常量相关联的属性的对象.
var bizzareObj = {valid_key: undefined};
在这种情况下,您将必须使用hasOwnProperty或在运算符中知道密钥是否确实存在.但是,但是以什么价格?
所以,我告诉你......
在 operator和hasOwnProperty中是在Javascript中使用属性描述符机制的"方法"(类似于Java语言中的Java反射).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
属性描述符类型用于解释命名属性属性的操作和具体化.属性描述符类型的值是由命名字段组成的记录,其中每个字段的名称是属性名称,其值是8.6.1中指定的相应属性值.此外,可以存在或不存在任何字段.
另一方面,调用对象方法或键将使用Javascript [[Get]]机制.那要快得多!
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
在运营商中 使用var result = "Impression" in array;
结果是
12,931,832 ±0.21% ops/sec 92% slower使用hasOwnProperty
var result = array.hasOwnProperty("Impression")
结果是
16,021,758 ±0.45% ops/sec 91% slower直接访问元素(括号样式)
var result = array["Impression"] === undefined
结果是
168,270,439 ±0.13 ops/sec 0.02% slower直接访问元素(对象样式)
var result = array.Impression === undefined;
结果是
168,303,172 ±0.20% fastest
undefined
价值的原因是什么?那个问题困扰着我.在Javascript中,至少有两个对缺席对象的引用,以避免这样的问题:null
和undefined
.
null
是原始价值,表示故意没有任何对象价值,或简称,确认缺乏价值.另一方面,undefined
是未知值(未定义).如果稍后将使用具有适当值的属性,请考虑使用null
引用而不是undefined
因为在初始时刻确认该属性缺少值.
相比:
var a = {1: null}; console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined. console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
避免使用undefined
值的对象.尽可能直接检查并用于null
初始化属性值.否则,请使用慢速in
运算符或hasOwnProperty()
方法.
正如人们所评论的那样,现代版本的Javascript引擎(使用firefox异常)改变了访问属性的方法.对于这种特定情况,当前实现比前一个实现慢,但是访问密钥和对象之间的差异是可忽略的.
它会回来undefined
.
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
是一个特殊的常数值.所以你可以说,例如
// note the three equal signs so that null won't be equal to undefined if( aa["goodbye"] === undefined ) { // do something }
这可能是检查丢失密钥的最佳方法.但是,正如下面的评论所指出的那样,理论上你可能希望得到实际值undefined
.我从来不需要这样做,也不能想出我为什么要这样做的理由,但为了完整起见,你可以使用in
运算符
// this works even if you have {"goodbye": undefined} if( "goodbye" in aa ) { // do something }
该接受的答案是指对象.小心使用in
运营商的阵列,以寻找数据,而不是键:
("true" in ["true", "false"]) // -> false (Because the keys of the above Array are actually 0 and 1)
测试数组中的现有元素:查找项目是否在JavaScript数组中的最佳方法?
"key" in obj
可能只测试与数组键非常不同的对象属性值
检查javascript对象中是否存在属性的三种方法:
!! obj.theProperty
将值转换为bool.除"false"值之外的所有值都返回TRUE
obj中的'theProperty'
如果属性存在则返回true,无论其值是多少(甚至为空)
obj.hasOwnProperty('theProperty')
不检查原型链.(因为所有对象都有'toString'方法,1和2将在其上返回true,而3可以在其上返回false.)
参考:
http://book.mixu.net/node/ch5.html
如果您使用underscore.js库,则对象/数组操作变得简单.
在你的情况下,可以使用_.has方法.例:
yourArray = {age: "10"} _.has(yourArray, "age")
返回true
但,
_.has(yourArray, "invalidKey")
返回false
回答:
if ("key" in myObj) { console.log("key exists!"); } else { console.log("key doesn't exist!"); }
说明:
该in
运营商将检查关键的对象存在.如果您检查了值是否未定义:if (myObj["key"] === 'undefined')
,则可能会遇到问题,因为对象可能存在于具有undefined
值的对象中.
因此,首先使用in
运算符然后在知道密钥存在之后比较密钥内的值是更好的做法.
这keyExists(key, search)
可以用于轻松查找对象或数组中的键!
只需将要查找的密钥传递给它,然后搜索要在其中找到它的obj(对象或数组).
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false
// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false
如何使用它:
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false
// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false
在对象中搜索键
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false
// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false
它非常可靠,并且跨浏览器运行良好.
vanila js
yourObjName.hasOwnProperty(key) : true ? false;
如果要检查对象在es2015中是否至少有一个属性
Object.keys(yourObjName).length : true ? false
使用Array#some
和Object.keys
.如果对象中存在给定键,则返回true,否则返回false.
var obj = {foo: 'one', bar: 'two'};
function isKeyInObject(obj, key) {
var res = Object.keys(obj).some(v => v == key);
console.log(res);
}
isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');