我试图理解数组“ includes”功能。我的目标是确定数组是否包含某个项目。它适用于字符串数组,但是在使用对象时不起作用。
var itemsString = ["name1", "name2"];
var itemsObject = [{ name: "name1" }, { name: "name2" }];
var itemToSearch = { name: "name1" };
console.log(itemsString.includes("name1" ));
console.log(itemsObject.includes(itemToSearch));
console.log(itemsObject.includes(x => x.name === "name1"));
输出:
“包含”是否与对象一起使用,还是需要使用其他功能?
答案 0 :(得分:4)
在这种情况下,您需要使用Array.prototype.some()
。 Array.prototype.includes()
不接受函数参数*,并且您没有测试严格的相等性。
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name:");
String name = scanner.nextLine();
System.out.println("We are gonna ask about some of your personal information.");
System.out.print("Enter your university:");
String uni = scanner.nextLine();
...
}
*来自注释部分的同等压力迫使我澄清const itemsObject = [{ name: "name1" }, { name: "name2" }];
console.log(itemsObject.some(x => x.name === "name1"));
确实接受函数参数,但不会将传递的函数用作判定给定项目是否匹配的谓词。相反,它将尝试在数组中找到一个严格等于传递的函数的项目。
答案 1 :(得分:3)
答案 2 :(得分:1)
是否“包含”对象,或者我需要使用其他对象? 功能?
包含对象的作品,但通过引用比较对象。
在您的情况下,尽管itemsObject
的第一个元素具有与itemToSearch
相同的键和值,但它们是不同的对象,因此 includes 不会之所以起作用,是因为对于对象而言,它会查找相同的对象实例。
为使其正常工作,您可以使用多种选择,例如.find
,.some
,.filter
。
我个人不建议使用的另一种解决方案,但我认为值得一提,如果您先将项目映射到字符串,则可以使用.includes
< / strong>。在这种情况下,可以使用JSON.stringify检查对象是否相同。 注意:这仅适用于单个关键项目。 JSON.stringify不会保留键和值的顺序,因此它仅适用于单个键对象(除非键和值在原始字符串化对象中的顺序相同)。此外,JSON.stringify方法比其他方法更重且性能更低,我只是认为值得一提。
下面分别列举一些例子。
var itemsString = ["name1", "name2"];
var itemsObject = [{ name: "name1" }, { name: "name2" }];
var itemToSearch = { name: "name1" };
console.log(itemsObject.some(r => r.name === itemToSearch.name));
console.log(!!itemsObject.find(r => r.name === itemToSearch.name));
// ^--- !! is used to cast to boolean.
console.log(itemsObject.filter(r => r.name === itemToSearch.name).length > 0);
console.log(itemsObject.map(i => JSON.stringify(i)).includes(JSON.stringify(itemToSearch)));
// ^--------------^ ^---------------------------------------^
// |------ this will stringify each object, converting it to a json string. |
// |
// this will check whether the string[] includes any stringified value.--^