如何检查一个特定的键是否存在于JavaScript对象/数组中

409 阅读5分钟

简介

JavaScript中的对象是一个无序的键值对集合(key: value)。每个 关键被称为 属性,是一个字符串,代表一个属性名称。如果一个非字符串被赋予作为键,它的字符串表示将被使用。一个属性的 可以是任何符合该属性概念的数据类型--一个字符串、一个数字、一个数组,甚至是一个函数。

另一方面,数组是一个经过排序的值集。每个值都被称为一个元素,它由一个数字索引来识别。一个数组可以包括几乎任何类型的值。例如,它可以存储像整数、字符串、布尔运算、函数等项目。JavaScript数组也不局限于单一类型,这意味着一个给定的数组可以包含多种不同的类型。

当在JavaScript中工作时,你可能在某个特定的时间点上需要确定某个键是否存在于一个给定的对象或数组中。

在这篇文章中,我们将看到各种方法,我们可以用这些方法来检查一个特定的键是否存在于JavaScript对象/数组中。

使用in 操作符

JavaScript中的in 操作符被用来确定某个属性是否存在于一个对象或其继承的属性中(也被称为原型链)。如果提供的属性存在,in 操作符就会返回真。

检查一个对象
let user = {
    name: 'John Doe',
    age: 17,
    profession: 'Farmer'
};
  
// Check if key exists
  
'name' in user; // Returns true
'profession' in user; // Returns true
'Daniel' in user; // Returns false becuase no key like that exists
'Farmer' in user; // Returns false because 'Farmer' is not a key, but a value
检查一个数组

既然我们证明了JavaScriptin 操作符可以用于对象,你可能会问它是否也可以用于数组。在JavaScript中,所有东西都是Object类型的实例(除了基元),所以数组也支持in 操作符。

让我们用instanceof 操作符来确认它是否是Object 类型的实例。

let numbers = [22, 3, 74, 35];
  
numbers instanceof Object // Returns true

现在,回到使用in 操作符。

let number = [12, 33, 14, 45, 6];

33 in number; // Returns true
12 in number; // Returns true

8 in number; // Returns false because the 8 index does exist on the array 
6 in number; // Returns false because the 6 index does not exist on the array rather it exists as a value

这也会为数组类型的方法属性返回true ,数字数组是其中的一个实例。

'map' in number; // Returns true because 'map' is a method attribute of the array type

使用hasOwnProperty() 方法

在JavaScript中,hasOwnProperty() 函数被用来确定对象是否有提供的属性作为它自己的属性。这对于确定该属性是否被对象继承而不是自己的属性是很重要的。

检查一个对象
let user = {
    name: 'John Doe',
    age: 17,
    profession: 'Farmer'
};
  
// Check if key exists
let hasKey = user.hasOwnProperty('name'); 
  
if (hasKey) {
    console.log('This key exists.');
} else {
    console.log('This key does not exist.');
}
检查一个数组

你可能开始怀疑这是否对数组有效。正如我们前面所说,数组实际上是Object 类型的一个原型(实例),因此它也有这个方法可用。

let number = [12, 33, 14, 45];

// Check if key exists
number.hasOwnProperty(1); // Returns true
number.hasOwnProperty(0); // Returns true
number.hasOwnProperty(7); // Returns false because 7 is not an existing index on the array

使用Object.key() 方法

静态方法Object.key 生成并返回一个数组,其组成部分是一个对象的属性名称(键)的字符串。这可以用来循环浏览对象的键,然后我们可以用它来验证是否有任何键与对象中的某个键相匹配。

使用some() 方法

some() true 是一个JavaScript方法,它在调用数组的所有元素上测试一个回调函数,如果回调函数对其中任何一个元素返回 。true

对对象使用some()
let user = {
    name: 'John Doe',
    age: 17,
    profession: 'Farmer'
};
  
// Check if key exists
Object.keys(user).some(key => key === 'name'); // Returns true
Object.keys(user).some(key => key === 'role'); // Returns false

我们也可以把它定制为一个可重用的函数。

const checkKey = (obj, keyName) => {
    let keyExist = Object.keys(obj).some(key => key === keyName);
    console.log(keyExist);
};
  
checkKey(user, 'name'); // Return true
对数组使用some()
let number = [12, 33, 14, 45];
    
// Check if key exists
number.some(value => value === 1); // Returns true
number.some(value => value === 7); // Returns false

同样,就像对待对象一样,我们也可以利用类似的自定义可重用函数来检查一个值在数组中是否存在。

const checkVal = (arr, val) => {
    let valExist = arr.some(value => value === val);
    console.log(valExist);
};

checkVal(number, 7); // Returns false
checkVal(number, 0); // Returns true
使用indexOf() 方法

JavaScript的indexOf() 方法将返回数组中一个元素的第一个实例的索引。如果该元素不存在,就会返回-1。

对一个对象使用indexOf()

JavaScript中的Object 类型实际上并不支持indexOf 方法,因为它的属性/键在对象中没有固有的索引位置。相反,我们可以把对象的键作为一个数组来获取,然后用indexOf 方法检查一个键的存在。

let user = {
    name: 'John Doe',
    age: 17,
    profession: 'Farmer'
};

// Check if key exists
Object.keys(user).indexOf('name') // Returns 0
Object.keys(user).indexOf('role') // Returns -1

请记住,JavaScript对象并不总是保留键的顺序,所以返回的索引可能不像数组中那样有意义。在这种情况下,索引应该主要用于确定一个键的存在。

下面是一个在实用函数中使用的例子。

const checkKey = (obj, keyName) => {
    if (Object.keys(obj).indexOf(keyName) !== -1) {
        console.log('This key exists');
    } else {
        console.log('This key does not exist');
    }
};
  
checkKey(user, 'name'); // Logs 'This key exists'
checkKey(user, 'role'); // Logs 'This key does not exists'
对一个数组使用indexOf()

正如我们在前面的例子中看到的,数组确实支持indexOf 方法,与对象不同。要使用它,把你要找的项的值传给indexOf ,如果该值在数组中存在,它就会返回该值的位置。

let number = [12, 33, 14, 45];
    
// Find position of the item in the array
number.indexOf(14); // Returns 2
number.indexOf(7);  // Returns -1

结论

在这篇文章中,我们已经看到了所有可能的方法,我们可以检查一个键或项目是否存在于一个JavaScript对象/数组中。我们展示了如何利用in 操作符、hasOwnProperty() 方法和some 方法。我们还看到了JS对象和数组的相似之处,即数组继承于对象,因此包含许多相同的方法。