$ .each在$ .each中返回最后一个值

时间:2015-05-01 04:28:48

标签: javascript arrays object each

我需要在每个对象中放置一个数组,然后遍历这个最近添加的数组,将对象的属性放在对象内的数组的每个实例中。

像这样:

 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

2 个答案:

答案 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>