检查一个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
。
在运算符中使用
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有两个引用缺席的对象,以避免这样的问题: null
和undefined
。
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对象中是否存在一个属性:
- !obj.theProperty
将值转换为布尔值。 除了“错误”值之外,所有返回TRUE - 在obj的“物业”
如果属性存在,将返回true,不pipe它的值(甚至是空的) - obj.hasOwnProperty( '利人')
不检查原型链。 (因为所有对象都有'toString'方法,所以1和2将返回true,而3可以返回false。)
参考:
如果您使用的是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#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');
我们可以使用 – 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