乐闻世界logo
搜索文章和话题

如何检查 javascript 对象中是否存在某个 key 值?

9 个月前提问
5 个月前修改
浏览次数55

6个答案

1
2
3
4
5
6

在JavaScript中,可以使用多种方法来检查对象中是否存在某个值。这里我将介绍几种常见的办法:

使用 for...in 循环

这种方法通过遍历对象的所有属性来检查是否有属性的值等于我们要找的值。

javascript
function hasValue(obj, value) { for (let key in obj) { if (obj.hasOwnProperty(key) && obj[key] === value) { return true; } } return false; } // 例子 const person = { name: 'Alice', age: 25 }; console.log(hasValue(person, 25)); // 输出 true console.log(hasValue(person, 'Bob')); // 输出 false

使用 Object.values()Array.prototype.includes()

Object.values() 方法返回一个数组,包含给定对象自身的所有可枚举属性值。结合数组的 includes() 方法,可以很容易地检查这个值数组中是否包含特定的值。

javascript
function hasValue(obj, value) { return Object.values(obj).includes(value); } // 例子 const person = { name: 'Alice', age: 25 }; console.log(hasValue(person, 25)); // 输出 true console.log(hasValue(person, 'Bob')); // 输出 false

使用 Object.entries()Array.prototype.some()

Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组。使用数组的 some() 方法可以检查数组中至少有一个元素满足提供的函数。

javascript
function hasValue(obj, value) { return Object.entries(obj).some(([key, val]) => val === value); } // 例子 const person = { name: 'Alice', age: 25 }; console.log(hasValue(person, 25)); // 输出 true console.log(hasValue(person, 'Bob')); // 输出 false

使用 JSON.stringify()

这个方法相对简单粗暴,它将对象转换成字符串,然后检查该字符串中是否包含特定的值。但是请注意,这种方法并不总是可靠的,因为它也可能匹配到对象的键或者结构中的字符串,并且对于对象内嵌套的对象或数组来说,可能无法正确匹配。

javascript
function hasValue(obj, value) { return JSON.stringify(obj).includes(value); } // 例子 const person = { name: 'Alice', age: 25 }; console.log(hasValue(person, 25)); // 输出 true (注意:25被转换成了字符串) console.log(hasValue(person, 'Bob')); // 输出 false

在实际使用中,应根据具体的场景和需求选择最合适的方法。例如,如果你知道值是不会重复的或者是唯一的,那么使用 Object.values() 结合 includes() 方法可能是最简洁明了的选择。而如果你需要处理更复杂的数据结构,可能需要采用更为复杂的方法,如递归检查嵌套对象。

2024年6月29日 12:07 回复

检查未定义性并不是测试键是否存在的准确方法。如果键存在但值实际上是怎么办undefined

shell
var obj = { key: undefined }; console.log(obj["key"] !== undefined); // false, but the key exists!

运行代码片段Hide results

展开片段

您应该使用in运算符:

shell
var obj = { key: undefined }; console.log("key" in obj); // true, regardless of the actual value

运行代码片段Hide results

展开片段

如果你想检查某个键是否不存在,请记住使用括号:

shell
var obj = { not_key: undefined }; console.log(!("key" in obj)); // true if "key" doesn't exist in object console.log(!"key" in obj); // Do not do this! It is equivalent to "false in obj"

运行代码片段Hide results

展开片段

或者,如果您想特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty

shell
var obj = { key: undefined }; console.log(obj.hasOwnProperty("key")); // true

运行代码片段Hide results

展开片段

in有关和hasOwnPropertykey方法之间的性能比较undefined,请参阅基准测试

基准测试结果

2024年6月29日 12:07 回复

快速回答

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

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

_操作符_和_hasOwnProperty_方法缓慢而可靠

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

shell
var bizzareObj = {valid_key: undefined};

在这种情况下,您必须使用_hasOwnProperty_或_in_运算符来知道密钥是否确实存在。但是,但是要以什么价格呢?

所以,我告诉你...

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

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

属性描述符类型用于解释命名属性的操作和具体化。属性描述符类型的值是由命名字段组成的记录,其中每个字段的名称是属性名称,其值是 8.6.1 中指定的相应属性值。此外,任何字段都可以存在或不存在。

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

基准

https://jsben.ch/HaHQt

比较 JS 中的按键访问

使用_in_运算符

shell
var result = "Impression" in array;

结果是

shell
12,931,832 ±0.21% ops/sec 92% slower

使用 hasOwnProperty

shell
var result = array.hasOwnProperty("Impression")

结果是

shell
16,021,758 ±0.45% ops/sec 91% slower

直接访问元素(括号样式)

shell
var result = array["Impression"] === undefined

结果是

shell
168,270,439 ±0.13 ops/sec 0.02% slower

直接访问元素(对象样式)

shell
var result = array.Impression === undefined;

结果是

shell
168,303,172 ±0.20% fastest

编辑:为属性分配值的原因是什么undefined

这个问题让我很困惑。在 Javascript 中,至少有两个对不存在对象的引用,以避免出现这样的问题:nullundefined

null是表示故意不存在任何对象值的原始值,或者简单地说,是确认缺乏值。另一方面,undefined是一个未知值(未定义)。如果存在稍后将使用_适当_值的属性,请考虑使用null引用,而不是undefined因为在最初时刻确认该属性缺乏价值。

比较:

shell
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()方法。

编辑:12/04/2018 - 不再相关

正如人们所评论的,现代版本的 Javascript 引擎(Firefox 除外)已经改变了访问属性的方法。对于这种特殊情况,当前的实现比以前的实现慢,但访问密钥和对象之间的差异可以忽略不计。

2024年6月29日 12:07 回复

它会回来的undefined

shell
var aa = {hello: "world"}; alert( aa["hello"] ); // popup box with "world" alert( aa["goodbye"] ); // popup box with "undefined"

运行代码片段Hide results

展开片段

undefined是一个特殊的常数值。所以你可以说,例如

shell
// note the three equal signs so that null won't be equal to undefined if( aa["goodbye"] === undefined ) { // do something }

这可能是检查丢失钥匙的最佳方法。然而,正如下面的评论所指出的,理论上您可能希望实际值为undefined。我从来没有需要这样做,也想不出我想要这样做的原因,但为了完整起见,您可以使用运算in

shell
// this works even if you have {"goodbye": undefined} if( "goodbye" in aa ) { // do something }
2024年6月29日 12:07 回复
  1. 检查对象的属性,包括继承的属性

可以使用in运算符来确定,如果指定的属性位于指定对象或其原​​型链中,则返回 true,否则返回 false

shell
const person = { name: 'dan' }; console.log('name' in person); // true console.log('age' in person); // false

运行代码片段Hide results

展开片段

  1. 检查对象实例的属性(不包括继承的属性)

*2021 - 使用新方法***Object.hasOwn()作为替代Object.hasOwnProperty()

Object.hasOwn()旨在替代 Safari,Object.hasOwnProperty()并且是一种可供使用的新方法(但尚未得到 safari 等所有浏览器的完全支持,但很快就会得到支持)

Object.hasOwn()是一个静态方法,如果指定对象将指定属性作为其自己的属性,则返回 true。如果该属性是继承的或不存在,则该方法返回 false。

shell
const person = { name: 'dan' }; console.log(Object.hasOwn(person, 'name'));// true console.log(Object.hasOwn(person, 'age'));// false const person2 = Object.create({gender: 'male'}); console.log(Object.hasOwn(person2, 'gender'));// false

运行代码片段Hide results

展开片段

使用它而不是 Object.prototype.hasOwnProperty 的动机是什么? - 建议使用此方法而不是 ,Object.hasOwnProperty()因为它也适用于通过使用创建的对象Object.create(null)以及覆盖继承hasOwnProperty()方法的对象。尽管可以通过调用Object.prototype.hasOwnProperty()外部对象来解决此类问题,Object.hasOwn()但克服这些问题是首选(请参见下面的示例)

shell
let person = { hasOwnProperty: function() { return false; }, age: 35 }; if (Object.hasOwn(person, 'age')) { console.log(person.age); // true - the remplementation of hasOwnProperty() did not affect the Object }

运行代码片段Hide results

展开片段

shell
let person = Object.create(null); person.age = 35; if (Object.hasOwn(person, 'age')) { console.log(person.age); // true - works regardless of how the object was created }

运行代码片段Hide results

展开片段

更多信息Object.hasOwn可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

浏览器兼容性Object.hasOwn- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility

2024年6月29日 12:07 回复

"key" in obj

可能只测试与数组键非常不同的对象属性值

2024年6月29日 12:07 回复

你的答案