У меня есть пара массивов. Нужно занести определенные значения в нужные места. Здесь даже не столько AngularJS нужен, сколько чистый JS: проход по массивам и т.д.
Мои массивы:
$scope.usersNew - массив пользователей с ответами на вопрос анкеты. Структура такая:
id - идентификатор, понятно.
user - имя пользователя,
questions - массив ответов на вопросы. Его структура следующая:
id вопроса,
name вопроса,
answer - собственно, ответ. По умолчанию записана строка "No answer"
$scope.anss - массив всех ответов из базы данных. Структура (та ее часть, которую я использую):
sessionID - идентификатор сессии, аналог имени пользователя,
questionAnswer - структура, в которой хранится информация о вопросе и
ответе. Из нее беру:
question - структура с информацией о вопросе. Я использую только поле id,
answer - структура с информацией об ответе. Я использую поле text
Мой код:
// формирование массива пользователей с ответами
// проход по пользователя
for (var k = 0; k < $scope.usersNew.length; k++) {
// проход по ответам
for (var i = 0; i < $scope.anss.length; i++) {
// принадлежность ответа пользователю
if ($scope.anss[i].sessionID == $scope.usersNew[k].user) {
// проход по ответам пользователя
for (var j = 0; j < $scope.usersNew[k].questions.length; j++) {
// соответствие ответов по id вопроса
if ($scope.usersNew[k].questions[j].id ==
$scope.anss[i].questionAnswer.question.id) {
// присвоение ответа пользователю
$scope.usersNew[k].questions[j].answer =
$scope.anss[i].questionAnswer.answer.text;
break; break;
}
}
}
}
}
Дебаггер показал, что в строке присвоения ответа пользователю программа записывает этот ответ сразу всем пользователям, хотя пользователи вроде как перебираются в самом верхнем for
У меня появилась мысль: может, дело в том, как я заполняла первый массив usersNew? Когда записывала в поля answer значение "No answer", это выглядело примерно так:
for (var i = 0; i < $scope.anss.length; i++) {
var item = { id: "", user: "", questions: {} }
item.id = $scope.anss[i].id;
item.user = $scope.anss[i].sessionID;
item.questions = $scope.arrForAns;
users.push(item);
}
Где $scope.arrForAns - массив, созданный таким образом:
$scope.arrForAns = answers.questions;
// answers.questions - это массив объектов, который я достала из JSON, там уже есть id и name
for (var i = 0; i < $scope.arrForAns.length; i++) {
$scope.arrForAns[i].answer = "No answer";
}
Я вроде читала, уже не уверена где, что с присвоением массивов есть загвоздка: что копируются не данные, а ссылки, и, возможно, в памяти лежит один несчастный массив questions на всех пользователей, и он-то и терзается со всех сторон.
Или я ошибаюсь, и это я читала о чем-то другом.
Ответ
Да. Для всего, кроме примитивных типов копируется ссылка.
К примитивным типам относятся созданные без использования new числа, строки и bool'ы, а также null и undefined.
PS: Не лень было такой вопрос задавать вместо того, чтобы погуглить про передачу по ссылке?
гугл объяснил в чем дело, но его решение почему-то не помогает
Не очень разобрался со всей структурой, но подозреваю, что это из-за того, что внутри массива тоже ссылки. Ангуляр позволяет сделать глубокую копию при помощи angular.copy
item.questions = angular.copy($scope.arrForAns);
Комментариев нет:
Отправить комментарий