使用Array.prototype.includes定位对象数组中的属性

时间:2018-11-30 18:12:55

标签: javascript arrays

使用Array.prototype.includes,您可以执行以下操作:

let array1 = [1, 2, 3];

console.log(array1.includes(2)); // return true

我的问题是:是否可以将includes用于要在其中查找“ name” =“ Jane”的对象数组?以以下数据为例:

let array2 = [{"name" : "John", age: 24}, {"name" : "Jane", age: 36}]

您可以使用includes方法执行此操作吗?它看起来像什么?

4 个答案:

答案 0 :(得分:7)

您可以 使用它,但前提是您具有对对象的引用(不是其结构等效项)。

const o1 = { name: '1' }
const o2 = { name: '2' }
const arr = [o1, o2]
arr.includes(o1) // true
arr.includes({ name: '1' }) // false

这是因为includes使用“ SameValueZero”算法as per the spec(强调我):

  

includessearchElement与数组的元素按升序进行比较,使用SameValueZero算法,如果发现在任何位置,则返回true ;否则,将返回false

SameValueZero”对于不同的引用将始终返回false,因此,上述代码的第二次尝试将返回false

您可以改用Array#some,它可以让您指定一个lambda作为参数。然后,您甚至可以为对象编写自定义相等逻辑。

arr.some(o => o.name == '1') // true

your comment中,我看到您有兴趣检查多个值。在这种情况下,您可以将||运算符与some一起使用:

arr.some(o => o.name == '1' || o.name == '2' || o.name == '3')

如果您不想指定所有这些对象,则可以执行以下操作。

arr.some(o => ['1', '2', '3'].includes(o.name))

答案 1 :(得分:3)

在这种情况下,您可以改用some方法,它将在第一个比赛中返回true

let array = [{"name" : "John", age: 24}, {"name" : "Jane", age: 36}]
let check = array.some(({name}) => name == 'Jane');
console.log(check)

答案 2 :(得分:2)

  array.find(user => user.name === "Jane")

当对象通过引用进行比较时,.includes在大多数情况下无济于事,因此您必须手动检查所有元素并检查是否相等,这就是.find所做的。它要么返回找到的用户,要么返回undefined。如果您只需要布尔运算符.some,其用法类似于.find,但返回true或false。

答案 3 :(得分:0)

您可以这样做。

let array2 = [{
  "name": "John",
  age: 24
}, {
  "name": "Jane",
  age: 36
}]

var some = array2.some((i) => {
  return i.name === 'Jane'
})

var map = array2.map((i) => {
  return i.name === 'Jane'
})

console.log('some', some)
console.log('map', map)