Why jQuery.inArray doesn't work on array of objects

前端 未结 3 1368
感动是毒
感动是毒 2021-01-19 02:43

I have array of objects

var arr = [
        {\"id\" : \"1\", \"description\" : \"one\"},
        {\"id\" : \"2\", \"description\" : \"two\"},
        {\"id\"         


        
相关标签:
3条回答
  • 2021-01-19 03:09

    You can use a function that takes a callback:

    function arrayFind(arr, fn) {
        for( var i = 0, len = arr.length; i < len; ++i ) {
            if( fn(arr[i]) ) {
                return i;
            }
        }
        return -1;
    }
    
    var arr = [
            {"id" : "1", "description" : "one"},
            {"id" : "2", "description" : "two"},
            {"id" : "3", "description" : "three"}
    ];
    
    var result = arrayFind(arr, function(v){
        return v.id === "2" && v.description === "two";
    });
    console.log(result) //1
    
    0 讨论(0)
  • 2021-01-19 03:12

    As TJ said, inArray uses === (indexOf actually, but that's the same thing), therefore even identical literals are compared non equal. Here's a workaround:

    var index = jQuery.inArray( 
        JSON.stringify({"id" : "2", "description" : "two"}), 
        $.map(arr, JSON.stringify) )
    

    http://jsfiddle.net/7kg9P/1/

    0 讨论(0)
  • 2021-01-19 03:18

    Because inArray uses === to compare elements, and different objects are never === to one another. (They're also not == to one another.)

    E.g.:

    var a = {"foo": "bar"};
    var b = {"foo": "bar"};
    console.log(a === b); // "false"
    

    You'll need to create a method on them to compare them for equivalence, and then do the search yourself.

    0 讨论(0)
提交回复
热议问题