我需要在每个对象中放置一个数组,然后遍历这个最近添加的数组,将对象的属性放在对象内的数组的每个实例中。
像这样: var answer = [];//with three objects in here
var alternatives = [{id_alternative : 40},{id_alternative : 47},{id_alternative : 56}]
$.each(alternatives, function(index, item){
item.answers = answer;
$.each(item.answers, function(i, ans){
ans.alternative = item.id_alternative;
}
}
但是在结果中我总是得到替代品[任何索引] .answers [任何索引]。替代总是56.我不知道到底发生了什么。
想要一些帮助,谢谢!
修改
“里面有三个对象”是指内部有其他类型数据的对象数组,数组“answer”中的每个对象都包含一个字符串question_name和一个整数的real_answer。
我最终需要的是:
alternatives = [
{id_alternatives:40,
answers:[{
alternative:40,
question_name: "string",
real_answer:489},
{
alternative:40,
question_name: "string",
real_answer:548},
{
alternative:40,
question_name: "string",
real_answer:40}
]},//with several other objects with this structure, but other data
答案 0 :(得分:2)
您只在第一行创建一个数组([]
),然后共享其引用并在代码中修改它。如果需要不同的数组,则必须单独创建它们。例如,您可以替换
item.answers = answer;
与
item.answers = answer.slice(0);
这是用于制作数组副本的数组克隆的JavaScript习惯用法。如果你正在修改它里面的元素(你似乎是;你的例子不完整),那就不够了,因为它会克隆对元素的引用,而不是元素本身,你需要一个深层复制。使用新对象构造一个新数组可能更容易,而不是在该行。
答案 1 :(得分:0)
试试这个。
问题是你为每个替代品使用Same声明的数组。 所以要解决这个问题,你只需要在循环中移动该数组,这样每个替代方案都可以获得它自己的新数组。
var alternatives = [{id_alternative : 40},{id_alternative : 47},{id_alternative : 56}]
$.each(alternatives, function(index, item){
item.answers = [{alternative:0},{alternative:0},{alternative:0}];//with three objects in here;
$.each(item.answers, function(i, ans){
ans.alternative = item.id_alternative;
});
});
console.log(alternatives);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>