Обновите существующее значение ключа в хэше в javascript/angularjs

Я вставляю объект в массив с двумя ключами question_id а также rating всякий раз, когда пользователь нажимает на звезду на передней панели. Что я ищу, если пользователь изменяет рейтинг какой-либо звезды, затем обновляет значение существующего ключа (если присутствует), в противном случае вставляет запись в массив.

Пример кода ниже

$scope.yellowPages = [] // is defined

if ($scope.yellowPages.length > 1) {
    for (var i = 0 ; i < $scope.yellowPages.length; i++) {
      if ($scope.yellowPages[i]["question_id"] == question_id) {
          $scope.yellowPages[i]["rating"] = rating; // here updating the existing value of key, but what is happening it's updates and as well as creates a new entry with the updated value.
      }
      else{
        $scope.yellowPages.push({rating: rating, question_id: question_id});
      } // if not present
    }
  }
  else{
    $scope.yellowPages.push({rating: rating, question_id: question_id}); // for 1st time
  } 
}

Моя конечная цель - иметь уникальный question_id's и там ratingМассив должен только 5 элементов.

Спасибо

3 ответа

Это связано с вашим if/else в цикле for. Вы проверяете, является ли текущий элемент в итерации forloop тем же вопросом:

if ($scope.yellowPages[i]["question_id"] == question_id) {

Если это не так, вы помещаете элемент в массив:

$scope.yellowPages.push({rating: rating, question_id: question_id});

Это происходит для каждой итерации цикла. Так, например, если у вас есть 3 элемента в массиве, а соответствующий идентификатор вопроса является третьим элементом, вы вставите новый объект ($scope.yellowPages.push({rating: rating, question_id: question_id});) в массив до достижения соответствующего объекта в третьем индексе и обновления его рейтинга.

Я делаю это только для того, чтобы обновить существующее значение, так как мне нужно только 5 значений, присутствующих в массиве, поэтому я проверяю только после вставки 5 начальных значений. Однако я думаю, что это не самый оптимальный способ достичь этого, но это решило мою проблему, любая другая помощь приветствуется

if ($scope.yellowPages.length >= 5) {
    for (var i = 0 ; i < $scope.yellowPages.length; i++) {
      if ($scope.yellowPages[i]["question_id"] == question_id) {
        $scope.yellowPages[i]["rating"] = rating;
      }
    }
  }
  else{
    $scope.yellowPages.push({rating: rating, question_id: question_id});
  }

Почему вы используете массив? Вместо этого используйте объект, который выглядит следующим образом:

$scope.yellowPages = {
   "question_id1": "rating1",
   "question_id2": "rating2"
}

с этим вы можете легко получить доступ к своим вопросам без зацикливания.

Другие вопросы по тегам