Обновите существующее значение ключа в хэше в 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"
}
с этим вы можете легко получить доступ к своим вопросам без зацикливания.