将对象压入数组会擦除而不是添加

Pushing object into array erases instead of adding

本文关键字:添加 擦除 对象 数组      更新时间:2023-09-26

我有一个这样的函数:

$scope.saveSearch = function () {
    var alreadyExist = false;
    for (var i = 0; i < $scope.savedSearch.length; i++) {
        if (JSON.stringify($scope.searched) === JSON.stringify($scope.savedSearch[i])) {
            alreadyExist = true;
            break;
        }
    }
    if (!alreadyExist) {
        $scope.savedSearch.push($scope.searched);
        localStorage.setItem("savedSearch", JSON.stringify($scope.savedSearch));
    }
};

之前:$scope.savedSearch = [];

$scope.searched = {
    IS: "",
    area: "",
    block: "",
    type: "",
    level: ""
};

$scope.searched对象中的值由用户初始化后修改。

我的问题是:$scope.savedSearch总是只包含最后一个被推入的对象。它不是将对象添加到数组中,而是替换当前对象。

我不明白为什么。

您需要将您的push行更改为:

$scope.savedSearch.push(angular.copy($scope.searched));

我认为你的问题是对象是通过引用传递的。由于savedSearch中的对象总是指向您正在搜索的对象,因此alreadyExist将始终为true。

我猜是对象引用被存储在数组中,而不是实际对象本身。因此,任何后续将对象推入数组的调用都将无法工作,因为对象引用已经存在于数组中。它只是更新了。

试试这个。使用angular.copy()创建对象的深度副本,并将副本推入数组。看看是否可以。

if (!alreadyExist) {
  $scope.savedSearch.push(angular.copy($scope.searched));
  localStorage.setItem("savedSearch", JSON.stringify($scope.savedSearch));
}

你将对象推入for语句之外所以只有一个元素被推入试着将它移到for语句中并且所有不存在的对象都将被推入

$scope.saveSearch = function () {
var alreadyExist = false;
for (var i = 0; i < $scope.savedSearch.length; i++) {
    if (JSON.stringify($scope.searched) === JSON.stringify($scope.savedSearch[i])) {
        alreadyExist = true;
        break;
    }
if (!alreadyExist) {
    $scope.savedSearch.push($scope.searched);
    localStorage.setItem("savedSearch", JSON.stringify($scope.savedSearch));
  }
 }
};

更简单的方法是直接

$scope.saveSearch = function () {
var alreadyExist = false;
for (var i = 0; i < $scope.savedSearch.length; i++) {
   if (JSON.stringify($scope.searched) != JSON.stringify($scope.savedSearch[i])) {
       $scope.savedSearch.push($scope.searched);
       localStorage.setItem("savedSearch", JSON.stringify($scope.savedSearch));
   }else{
     break
   }
 }
};