繁体   English   中英

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

[英]Using Array.prototype.includes to target property in an array of objects

使用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方法做的事情 - 它会是什么样子?

可以使用它,但前提是您有对象的引用( 而不是它的结构等价物)。

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

这是因为includes使用“SameValueZero”算法, 根据规范 (强调我的):

includes 使用SameValueZero算法searchElementsearchElement与数组元素进行比较,如果在任何位置找到,则返回true ; 否则,返回false

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

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

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

您的评论中 ,我发现您对检查多个值感兴趣。 你可以简单地使用|| 在这种情况下有some运算符:

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

如果您不希望像这样指定所有这些,您可以执行以下操作。

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

在这种情况下,您可以使用some方法,它将在第一次匹配时返回true

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

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

当对象通过引用进行比较时, .includes在大多数情况下对你没有帮助,那么你必须手动通过所有元素并检查是否相等,这就是.find所做的。 它要么返回找到的用户,要么返回undefined 如果你只需要一个布尔使用.some就像.find一样,但要么返回true或false。

你可以这样做。

 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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM