ben*_*ier 1 javascript arrays local-storage angularjs
我有这个angularjs数组:$scope.fav = []在函数调用中添加项(对象).这些对象的一个示例是{quote: "Some text", controller: some_controller}当我向数组添加新对象时,该数组将保存在localstorage中.数组工作正是我想要的,除非我尝试在console.log()中打印它,我得到很多[object,Object],我只是假设它是打印的方式.这不是主要问题,因为数组工作方式如何.
我遇到的问题是尝试查找对象是否已存在于数组中.我试过了
if ($scope.fav.indexOf({quote: q, controller: c}) == -1)
这似乎不起作用,因为每个进入的对象都是索引-1,即使它已经在数组中.我认为这是因为它没有正确读取对象.
最后我使用了这个功能:
$scope.containsObject = function(obj, list) {
var i;
for (i = 0; i < list.length; i++) {
if (list[i] === obj) {
return true;
}
}
return false;
Run Code Online (Sandbox Code Playgroud)
}
检查对象是否在数组中.以下是我的称呼方式:
$scope.addToFav = function(q, c) {
$scope.value = $scope.containsObject({quote: q, controller: c}, $scope.fav)
console.log($scope.value);
Run Code Online (Sandbox Code Playgroud)
}
即使对象在数组中,我仍然会为$ scope.value获取负值.对于长期复杂的解释,我们深表歉意.
感谢您的见解,Ben
Array.indexOf()并且===运算符比较对象引用,并且仅在比较对对象的同一实例的引用时才为true.{quote: q, controller: c}是一个完全不同于数组中对象实例的对象实例,即使它的属性与数组中的对象完全匹配.
Angular有一个辅助函数,称为angular.equals()2个对象的检查是等价的.你可以用它代替===......
$scope.containsObject = function(obj, list) {
var i;
for (i = 0; i < list.length; i++) {
if (angular.equals(list[i], obj)) {
return true;
}
}
return false;
};
Run Code Online (Sandbox Code Playgroud)