2014-04-22 3 views
1

이 anglejs 배열이 있습니다 : $scope.fav = [] 항목 (오브젝트)이 함수 호출시에 추가되는 곳입니다. 이러한 개체의 예는 {quote: "Some text", controller: some_controller}입니다. 배열에 새 개체를 추가하면 해당 배열은 localstorage에 저장됩니다. 이 배열은 console.log()에서 인쇄하려고 할 때를 제외하고 정확히 원하는대로 작동합니다. 많은 [object, Object]를 얻었습니다. 방금 인쇄 한 방식이라고 가정합니다. 배열이 필요로하는 방식으로 작동하기 때문에 이것이 주요한 문제는 아닙니다.오브젝트가 localStorage에있는 AngularJS 배열에 있는지 확인하십시오.

내가 가지고있는 문제는 개체가 이미 배열에 있는지 확인하는 것입니다. 나는

if ($scope.fav.indexOf({quote: q, controller: c}) == -1)

을 시도하고이가는 모든 개체는 인덱스 때문에 -1이 이미 배열의 경우에도 작동하지 않았다. 이것은 객체를 올바르게 읽지 못하기 때문입니다.

마지막 I는이 함수에 의존했다 :

$scope.containsObject = function(obj, list) { 
var i; 
for (i = 0; i < list.length; i++) { 
    if (list[i] === obj) { 
     return true; 
    } 
} 

return false; 

} 객체 어레이에 있는지 확인

. 여기에 내가 전화하는 방법입니다

$scope.addToFav = function(q, c) { 
    $scope.value = $scope.containsObject({quote: q, controller: c}, $scope.fav) 
    console.log($scope.value); 

}

내가 개체가 배열의 경우에도 $ scope.value에 대한 음의 값을 점점 계속. 오랫동안 복잡한 설명을 드려 죄송합니다.

는 벤

답변

7

Array.indexOf(), 당신의 통찰력 주셔서 감사하고 === 연산자는 객체 참조를 비교하고 개체의 동일한 인스턴스에 대한 참조를 비교하는 경우에만 해당. {quote: q, controller: c}은 해당 속성이 배열의 개체와 정확하게 일치하더라도 배열의 개체 인스턴스와 완전히 다른 개체 인스턴스입니다.

각도에는 angular.equals()이라는 보조 기능이있어 2 개의 개체가 같은지 확인합니다. , 실제로, 아마 JSON.decode을 사용하여 새 개체를 만드는 당신은 문자열을 변환 할 ... === 대신에

$scope.containsObject = function(obj, list) { 
    var i; 
    for (i = 0; i < list.length; i++) { 
     if (angular.equals(list[i], obj)) { 
      return true; 
     } 
    } 

    return false; 
}; 
+0

lo-dash 그 안토니 주셔서 너무 감사와 같은 다른 라이브러리를 사용, 그것은 매우 간단한 해결책이었다. Ben, Cheers – benjipelletier

2

로컬 스토리지에서 오브젝트를 검색하고 각각의 시간을 사용할 수 있습니다 로컬 저장소에 저장된 데이터를 개체로 가져옵니다.

새 개체에 동일한 데이터가 포함되어 있어도 기존의 (분명히 동일한 개체 임에도 불구하고) === (실제로는 느슨한 ==) 테스트가 실패합니다. indexOf은 완전 균등 연산자 ===을 사용하므로 동일한 방식으로 작동합니다.

개체가 다른 개체와 같은지 테스트하고 코드를 목록에 적용하려면 코드가 필요합니다.

$scope.containsObject = function(obj, list) { 
    return list.filter(function(listItem) { 
    return angular.equals(listItem, obj) 
    }).length > 0; 
} 

내가 생각하지 않는 filter 기능은 IE8의 일부입니다 : 한 가지 방법은 깊은 객체의 비교 및 ​​filter을 수행 angular.equals의 조합을 사용하는 것입니다.당신은 IE8 지원이 필요한 경우, 당신은 polyfill를 사용하거나

$scope.containsObject = function(obj, list) { 
    return _.filter(list, function(listItem) { 
    return angular.equals(listItem, obj) 
    }).length > 0; 
} 
관련 문제