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

时间:2019-03-29 10:05:25

标签: javascript

我试图理解数组“ 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"));

输出:

  • true
  • false
  • false

“包含”是否与对象一起使用,还是需要使用其他功能?

3 个答案:

答案 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)

在最后一行中,检查是否在数组内部有函数。 .includes也适用于对象,但是它通过引用比较它们。在您的情况下,您可能想.find或检查.some是否与查询匹配的对象。

答案 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.--^