检查一个JavaScript对象中是否存在一个键?

如何检查JavaScript对象或数组中是否存在特定的键?

如果一个键不存在,我尝试访问它,它会返回false? 或者抛出一个错误?

检查undefined-ness并不是testing密钥是否存在的准确方法。 如果密钥存在但是值实际上是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" 

或者,如果要特别testing对象实例的属性(而不是inheritance属性),请使用hasOwnProperty

 obj.hasOwnProperty("key") // true 

编辑:为了性能之间的比较, hasOwnProperty和关键是undefined ,请参阅此基准

快速回答

如何检查JavaScript对象或数组中是否存在特定的键? 如果一个键不存在,我尝试访问它,它会返回false? 或者抛出一个错误?

使用(关联)数组样式或对象样式直接访问缺less的属性将返回一个未定义的常量。

运算符和hasOwnProperty方法中运行缓慢可靠

正如人们在这里已经提到的,你可以拥有一个与“未定义”常量相关联的属性的对象。

  var bizzareObj = {valid_key: undefined}; 

在这种情况下,您将不得不使用hasOwnProperty或运算符来知道密钥是否真的存在。 但是, 在什么价格?

所以,我告诉你…

in运算符和hasOwnProperty是在Javascript中使用属性描述符机制(类似于Java语言中的Javareflection)的“方法”。

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

属性描述符types用于解释命名属性属性的操作和通用化。 属性描述符types的值是由命名字段组成的logging,其中每个字段的名称是属性名称,其值是8.6.1中指定的相应属性值。 另外,任何字段可以存在或不存在。

另一方面,调用对象方法或者键将使用Javascript [[Get]]机制。 这太快了!

基准

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

比较JS中的关键访问

运算符中使用

 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中,至less有两个引用缺席的对象,以避免这样的问题: nullundefined

null是表示故意不存在任何对象值的原始值,或者简言之, 表示缺乏价值。 另一方面, undefined的值是未知值(未定义)。 如果有一个属性稍后使用一个适当的值,可以考虑使用null引用,而不是undefined因为在最初的时候,属性被确认为缺less一个值。

比较:

 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, ie: 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[]. 

最后build议

避免使用undefined值的对象。 直接检查,并使用null来初始化属性值。 否则,请使用slow in运算符或hasOwnProperty()方法。

它将返回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 } 

被接受的答案是指对象 。 小心使用Array上的in运算符来查找数据而不是键:

 ("true" in ["true", "false"]) // -> false (Because the keys of the above Array are actually 0 and 1) 

testing数组中的现有元素: find某个项目是否在JavaScript数组中的最佳方法?

 "key" in obj 

可能只testing与数组键相比非常不同的对象属性值

三种方法来检查一个JavaScript对象中是否存在一个属性:

  1. !obj.theProperty
    将值转换为布尔值。 除了“错误”值之外,所有返回TRUE
  2. 在obj的“物业”
    如果属性存在,将返回true,不pipe它的值(甚至是空的)
  3. obj.hasOwnProperty( '利人')
    不检查原型链。 (因为所有对象都有'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运算符是比较好的做法,然后比较一旦你已经知道它存在的键内的值。

这是一个帮手function,我觉得很有用

这个keyExists(key, search)可以用来轻松查找对象或数组中的键!

只要传递你想要find的密钥,然后search你想要find的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; } 

如何使用它:

在arrays中search密钥

 keyExists('apple', ['apple', 'banana', 'orange']); // true keyExists('fruit', ['apple', 'banana', 'orange']); // false 

在对象中search键

 keyExists('age', {'name': 'Bill', 'age': 29 }); // true keyExists('title', {'name': 'Jason', 'age': 29 }); // false 

这是相当可靠的,跨浏览器的效果很好。

vanila js

 yourObjName.hasOwnProperty(key) : true ? false; 

如果你想检查对象是否在es2015中至less有一个属性

 Object.keys(yourObjName).length : true ? false 

ES6解决scheme

使用Array#someObject.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'); 

我们可以使用 – hasOwnProperty.call(obj, key);

下划线.js的方式 –

 if(_.has(this.options, 'login')){ //key 'login' exists in this.options } _.has = function(obj, key) { return hasOwnProperty.call(obj, key); }; 

对于那些在他们的项目中包含lodash
有一个lodash _.get方法试图获得“深”的关键:

获取对象path的值。 如果parsing的值是未定义的,则在其位置返回defaultValue。

 var object = { 'a': [{ 'b': { 'c': 3 } }] }; console.log( _.get(object, 'a[0].b.c'), // => 3 _.get(object, ['a', '0', 'b', 'c']), // => 3 _.get(object, 'abc'), // => undefined _.get(object, 'abc', 'default') // => 'default' ) 
 <script src="ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

这是一个古老的问题,但我想永远不会迟到给出答案。

想象一下,你有一个对象“产品”和两个项目。 如果你想查看id是否已经存在于这个对象中,你可以使用find()

 products = [ { "id": 1, "name": "Name 1" }, { "id": 2, "name": "Name 2" }, ] item1 = { "id": 3, "name": "Name 3", } item2 = { "id": 1, "name": "Name 1", } if(products.find(x => x.id === item1.id)){ console.log('id is in products'); }else { console.log('id is not in products'); } if(products.find(x => x.id === item2.id)){ console.log('id is in products'); }else { console.log('id is not in products'); } 

日志:

 id is not in products id is in products