检查数组是否“包含”Javascript中的项

检查数组是否“包含”Javascript中的项,javascript,Javascript,我试图理解数组包含函数。我的目标是确定数组是否包含某个项。它适用于字符串数组,但在使用对象时不起作用 var itemsString=[name1,name2]; var itemsObject=[{name:name1},{name:name2}]; var itemToSearch={name:name1}; console.logitemsString.includeName1; console.logitemsObject.includesitemToSearch; console.l

我试图理解数组包含函数。我的目标是确定数组是否包含某个项。它适用于字符串数组,但在使用对象时不起作用

var itemsString=[name1,name2]; var itemsObject=[{name:name1},{name:name2}]; var itemToSearch={name:name1}; console.logitemsString.includeName1; console.logitemsObject.includesitemToSearch;
console.logitemsObject.includesx=>x.name==name1 在最后一行中,检查函数是否在数组中。Include也适用于对象,但它通过引用对对象进行比较。在您的情况下,您可能需要检查或检查对象是否与查询匹配。

在最后一行中,您检查函数是否在数组中。Include也适用于对象,但它通过引用对对象进行比较。在您的情况下,您可能需要检查对象是否与您的查询匹配。

在本例中需要使用。不接受函数参数*,并且您没有测试严格的相等性

const itemsObject=[{name:name1},{name:name2}]; console.logitemsObject.somex=>x.name==name1 在这种情况下,您需要使用。不接受函数参数*,并且您没有测试严格的相等性

const itemsObject=[{name:name1},{name:name2}]; console.logitemsObject.somex=>x.name==name1; 包括使用对象还是我需要使用其他对象 功能

“包含”用于对象,但它通过引用比较对象。 在您的情况下,尽管itemsObject的第一个元素具有itemToSearch的相同键和值,但它们是不同的对象,因此Include将不起作用,因为对于对象情况,它查找相同的对象实例

为了使它工作,您可以使用几种替代方法,如.find、.some、.filter

另一个解决方案,我个人不推荐,但我认为值得一提的是,如果您首先将项目映射到字符串,则可以使用.include。在这种情况下,可以使用JSON.stringify检查对象是否相同。注意:这只适用于单个关键项。stringify不保留键和值的顺序,因此它仅适用于单键对象,除非键和值在原始stringify对象中的顺序相同。此外,JSON.stringify方法比其他方法更重,性能更低,我只是认为值得一提作为一个例子

下面是一些例子

var itemsString=[name1,name2]; var itemsObject=[{name:name1},{name:name2}]; var itemToSearch={name:name1}; console.logitemsObject.somer=>r.name==itemToSearch.name; 控制台。日志!!itemsObject.findr=>r.name==itemToSearch.name; // ^-- !! 用于强制转换为布尔值。 console.logitemsObject.filterr=>r.name==itemToSearch.name.length>0; console.logitemsObject.mapi=>JSON.stringifyi.includesJSON.stringifyitemToSearch; // ^-------^ ^--------------------^ //|---这将字符串化每个对象,将其转换为json字符串| // | //这将检查字符串[]是否包含任何字符串化的值-^ 包括使用对象还是我需要使用其他对象 功能

“包含”用于对象,但它通过引用比较对象。 在您的情况下,尽管itemsObject的第一个元素具有itemToSearch的相同键和值,但它们是不同的对象,因此Include将不起作用,因为对于对象情况,它查找相同的对象实例

为了使它工作,您可以使用几种替代方法,如.find、.some、.filter

另一个解决方案,我个人不推荐,但我认为值得一提的是,如果您首先将项目映射到字符串,则可以使用.include。在这种情况下,可以使用JSON.stringify检查对象是否相同。注意:这只适用于单个关键项。stringify不保留键和值的顺序,因此它仅适用于单键对象,除非键和值在原始stringify对象中的顺序相同。此外,JSON.stringify方法比其他方法更重,性能更低,我只是认为值得一提作为一个例子

下面是一些例子

var itemsString=[name1,name2]; var itemsObject=[{name:name1},{name:name2}]; var itemToSearch={name:name1}; console.logitemsObject.somer=>r.name==itemToSearch.name; 控制台。日志!!itemsObject.findr=>r.name==itemToSearch.name; // ^-- !! 用于强制转换为布尔值。 console.logitemsObject.filterr=>r.name==itemToSearch.name.lengt h>0; console.logitemsObject.mapi=>JSON.stringifyi.includesJSON.stringifyitemToSearch; // ^-------^ ^--------------------^ //|---这将字符串化每个对象,将其转换为json字符串| // |
//这将检查字符串[]是否包含任何字符串化值。-^[{name:name1},{name:name2};索引0处的项实际上不同于var itemToSearch={name:name1};,因为它们是不同的对象。尽管两个对象具有相同的属性,但它们是不同的实例,因此它们具有不同的引用,因此它们不相同。但是,如果你将它们字符串化,那么它们在这种情况下将是相同的。为了消除混淆,Arrayincludes与对象的工作方式与所有对象比较的工作方式相同-它将仅在它实际上是相同的对象实例时才找到条目,而不是在它是看起来类似的对象时才找到条目。itemsObject.somex=>x.name==name1@giorgim谢谢重新考虑您上一次的尝试方向正确,只有要使用的方法不是.include,而是。[{name:name1},{name:name2}];索引0处的项实际上不同于var itemToSearch={name:name1};,因为它们是不同的对象。尽管两个对象具有相同的属性,但它们是不同的实例,因此它们具有不同的引用,因此它们不相同。但是,如果你将它们字符串化,那么它们在这种情况下将是相同的。为了消除混淆,Arrayincludes与对象的工作方式与所有对象比较的工作方式相同-它将仅在它实际上是相同的对象实例时才找到条目,而不是在它是看起来类似的对象时才找到条目。itemsObject.somex=>x.name==name1@giorgim谢谢重新考虑您上次的尝试方向是正确的,只有要使用的方法是not.include,但不接受函数参数它接受函数参数。如果没有,它将抛出一个错误。发生的情况是,函数没有执行,而是根据数组进行检查。该数组的任何对象都不是函数本身,因此,它返回false。@VLAZ好的,我的措辞有点不正确。我的意思是:不接受将用作谓词以确定给定数组项是否匹配的函数参数。然后请相应地调整答案。不接受函数参数它接受函数参数。如果没有,它将抛出一个错误。发生的情况是,函数没有执行,而是根据数组进行检查。该数组的任何对象都不是函数本身,因此,它返回false。@VLAZ好的,我的措辞有点不正确。我的意思是:不接受将用作谓词以确定给定数组项是否匹配的函数参数。然后请相应地调整您的答案。