嵌套的forLoop问题中的值已被覆盖

时间:2018-03-28 04:23:48

标签: javascript for-loop nested

我不确定我的代码有什么问题,在嵌套的for循环中值已被覆盖,请帮我调试以下代码。 var1是一个包含另一个名为list的数组的数组。 Var2也是一个数组,每个var2.data等于var1。我试图设置每个var2.data的list.id = var2.index,但由于某种原因,var2中的所有list.id都等于2,似乎该值已被覆盖。请参阅以下内容:

    let var1 = [{
        'name': 'name1',
        'list': [{
            id: 0,
            a: "test1",
            b: 'test2'
          },
          {
            id: 0,
            a: "aac",
            b: 'test2'
          },
          {
            id: 0,
            a: "aad",
            b: 'test2'
          },
        ]
      },
      {
        'name': 'name2',
        'list': [{
            id: 0,
            a: "test1",
            b: 'test2'
          },
          {
            id: 0,
            a: "aac",
            b: 'test2'
          },
          {
            id: 0,
            a: "aad",
            b: 'test2'
          },
        ]
      }
    ];

    let var2 = [{
        claim: 'claim1',
        ifn: '1',
        data: []
      },
      {
        claim: 'claim2',
        ifn: '2',
        data: []
      },
      {
        claim: 'claim3',
        ifn: '3',
        data: []
      },
    ]

    var2.forEach((item, i) => {
      var1.forEach(list => {
        list.list.forEach(val => {
          val.id = i;
        })
        item.data = list;
      })
    })
   console.log(var2)

我想让每个list.id等于var2的索引,如下所示,真的不知道如何让这段代码工作,请帮忙〜

var2 = [
{ claim:'claim1',ifn:'1',
  data:
      [{
        'name':'name1',
        'list':[
            {id:0,a:"test1",b:'test2'},
            {id:0,a:"aac",b:'test2'},
            {id:0,a:"aad",b:'test2'},
               ]
        },
        {
         'name':'name2',
         'list':[
                {id:0,a:"test1",b:'test2'},
                {id:0,a:"aac",b:'test2'},
                {id:0,a:"aad",b:'test2'},
               ]
      }]
},
{ claim:'claim2',ifn:'2',
  data:
      [{
        'name':'name1',
        'list':[
            {id:1,a:"test1",b:'test2'},
            {id:1,a:"aac",b:'test2'},
            {id:1,a:"aad",b:'test2'},
         ]
        },
    {
    'name':'name2',
        'list':[
                {id:1,a:"test1",b:'test2'},
                {id:1,a:"aac",b:'test2'},
                {id:1,a:"aad",b:'test2'},
               ]
      }]
},
{ claim:'claim3',ifn:'3',
  data:[{
        'name':'name1',
        'list':[
                {id:2,a:"test1",b:'test2'},
                {id:2,a:"aac",b:'test2'},
                {id:2,a:"aad",b:'test2'},
                ]
        },
        {
        'name':'name2',
        'list':[
            {id:2,a:"test1",b:'test2'},
                {id:2,a:"aac",b:'test2'},
                {id:2,a:"aad",b:'test2'},
               ]
     }]
  }
]

2 个答案:

答案 0 :(得分:0)

根据我的理解,您希望var2中的每个data值都指向var1。以下循环将执行此操作:

var2.forEach(item => item.data = var1);

但是,因为每个项目指向同一个对象,这意味着如果您更改var2中的任何data项目,它将更改所有项目。

如果您需要副本是唯一的,您可以使用以下内容制作新副本:

const getVar1 = () =>  [
  {
    'name': 'name1',
    'list':  [
      {
        id: 0,
        a: "test1",
        b: 'test2'
      },
      {
        id: 0,
        a: "aac",
        b: 'test2'
      },
      {
        id: 0,
        a: "aad",
        b: 'test2'
      },
    ]
  },
  ...
];

然后你可以像这样使用它:

var2.forEach(item => item.data = getVar1())

答案 1 :(得分:0)

您需要创建新副本。但渴望结果你可以使用这段代码 -

for (var i = 0; i < var2.length; i++) {

  var el = var2[i], arr = [];

  for (var j = 0; j < var1.length; j++) {

    var o = var1[j];

    for (var k = 0; k < o.list.length; k++) {
      var ob = o.list[k];
      console.log(ob);
      ob.id = i;
    }

    arr.push(o);
  }

  el.data = arr;
}