为什么indexOf()在正确的值上返回-1?

时间:2014-05-24 16:34:03

标签: javascript arrays angularjs indexof

我有这个for循环,它从单独的列表添加到一个名为$scope.stats

的列表中
for (var i = 0; i < $scope.totalNames.length; i++) {
    var list = $scope.totalNames[i];
    for (var j = 0; j < list.length; j++) {
        var quote = list[j].quote;
        if (typeof localStorage[quote] == "undefined") {
            localStorage[quote] = 0;
        }
        $scope.stats.pushUnique({quote: quote, value: localStorage[quote]});
    }
}

此代码有效。问题出在下面,其中indexOf返回-1,虽然我已经检查过,{quote: quote, value: localStorage[quote]}与列表中的元素完全相同。

//below is stated in a function where the quote var has the same value as quote var above

var index = $scope.stats.indexOf({quote: quote, value: localStorage[quote]}, 0);

alert(index); //returns -1

3 个答案:

答案 0 :(得分:1)

那是因为2个对象不一样。您无法使用==比较比较2个对象。拿这个缩小的例子:

[{a:'b'}].indexOf({a:'b'}); // returns -1

这是因为这两个对象尽管具有完全相同的内容,但它们为JavaScript附加了不同的对象ID。对象引用不同的对象,因此.indexOf无法在仅包含id为x的对象的数组中找到id为y的对象。 / p>

当您提供与其参数完全相同的对象时,可以使用indexOf。例如:

var obj = {a:'b'};
[obj, 1, 2, 3].indexOf(obj); //returns 0

因为它正在寻找id为x的对象,该对象确实存在于该数组中。

答案 1 :(得分:0)

当您要求indexOf某个对象{quote: quote, value: localStorage[quote]}时,它正在寻找对该特定对象的引用(该对象刚刚在您对indexOf的调用中创建),但是你是什么想要找到indexOf具有quote: quotevalue: localStorage[quote]的任何对象。

var found = $scope.stats.filter(function(stat){ return stat.quote == quote && stat.value == localStorage[quote]; });
var index = -1;
if(found.length > 0)
   index = $scope.stats.indexOf(found[0]);

这将获得匹配quote:quote和value:localStorage [quote]的第一个项目的对象引用,然后在数组中找到该项目的索引。

答案 2 :(得分:-1)

此自定义功能解决了我的问题:

    $scope.arrayObjectIndexOf = function(myArray, property, searchTerm){
    for(var i = 0, len = myArray.length; i < len; i++) {
        if (myArray[i][property] === searchTerm) return i;
    }
    return -1;
}