角度forEach中的数组符号

时间:2018-11-15 13:07:43

标签: arrays angularjs

我花了一个小时来调试一个非常琐碎的问题。但是我不明白为什么这种行为有时在什么条件下发生。为了说明我的问题,让我们举一个例子。

$scope.vm.PetList = pets; // pets comes from resolved request
$scope.vm.Person = person; // person comes from resolved request

// init logic
if (angular.isDefined($scope.vm.Person.Pets) && $scope.vm.Person.Pets.length) {
    angular.forEach($scope.vm.Person.Pets, function (pet) {
        // this is the part that works sometimes
        pet = FunctionThatReturnsObjectOrNull($scope.vm.PetList, 'Id', pet.Id);
    });

    angular.forEach($scope.vm.Person.Pets, function (pet, pkey) {
        // this works every time
        $scope.vm.Person.Pets[pkey] = FunctionThatReturnsObjectOrNull($scope.vm.PetList, 'Id', pet.Id);
    });
}

在这个特定的示例中,我不知道为什么要从宠物收藏中查找某人的宠物,但这足以说明我遇到问题的情况。

重要的是要注意,分配的右边总是正确评估。在第一个示例中,pet变量的赋值并不总是代表数组中的更改。

我了解为什么$scope.vm.Person.Pets[pkey]每次都能工作,因为那是正确的数组表示法。但是pet =表示法可以省去跟踪嵌套数组的keys的麻烦。

angular.forEach(collection, function (a) {
    if (a.collection.length > 0) {
        angular.forEach(a.collection, function (b) {
            b = doSomething();
        });
    }
});

如果有人可以对此有所了解,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

pet提供给迭代器函数的angular.forEach是对该数组内对象的“引用”。调用pet = ...是重新分配该引用以指向新对象,而不更改原始对象。 pets[pkey] = ...正在更新数组中的引用。