我正在尝试构建一个小型测验应用程序,作为其中的一部分,我创建了一个问题生成器。我正在尝试的是将所有选项推送到问题数组中,以将相应的选项保存到每个问题中。
这是我正在尝试的代码
var Question = { Questionid: 0, QuestionText: '', SectionId: 0, QuestionTime: 0, QuestionScore: 0, Mandatory: 0,Option:[] }
var Option = { OptionId: 0, QuestionId: 0, OptionText: '', RightAnswer: '' };
Question.Mandatory = $('#cb_mandatory').prop('checked') * -1;
Question.Questionid = typeof ($('#div_question').data('QuestionId')) == 'undefined' ? 0 : $('#div_question').data('QuestionId');
Question.QuestionScore = $('#txt_question_score').val();
Question.QuestionText = $('#txt_question').val();
Question.QuestionTime = $('#txt_question_time').val();
Question.SectionId = $('#dd_section').val();
//
$('.my-options').each(function (index, item) {
Option.OptionId = typeof ($(item).data('OptionId')) == 'undefined' ? 0 : $(item).data('OptionId');
Option.OptionText = $(item).find('input:text').val();
Option.QuestionId = typeof ($('#div_question').data('QuestionId')) == 'undefined' ? 0 : $('#div_question').data('QuestionId');
Option.RightAnswer = +$(item).find(':radio').is(':checked');
Question.Option.push(Option);
});
alert(JSON.stringify(Question));
在这里,当我检查最终警报时,所有数组元素都与最后一个元素相同。但是当我在每个选项的循环中放置一个警报时,它看起来有所不同。
所以我猜想当改变循环内的选项对象时,那些已经插入数组的对象也会改变。
那么我该如何解决这个问题呢?我的意思是我需要避免更改那些已经插入数组的内容。
最佳答案
JavaScript 中的对象是基于引用的。这意味着您每次插入数组的并不是一个新的 Option 对象,而是对同一个 Option 对象的引用。当您在每个循环中更改对象时 - 您插入的所有对象也会“更改” - 实际上它们没有,它们只是指向更改的对象。
您应该做的是将 var Option
减速移动到循环中,从而在每次迭代中创建(并推送)一个新的选项对象。
关于javascript - 将对象插入数组会更改数组 Javascript 中的现有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388666/