我有这个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
答案 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: quote
和value: 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;
}