2014-03-14 110 views
2

我有一个函数应该用键构建一个数组。这些键将有一系列对象作为值。Javascript/jQuery:嵌套循环,防止覆盖对象属性

我有一些循环嵌套在对方,我很接近解决方案,但在最后一个循环内我犯了一个错误,我看不到解决方案。

函数使用Id的数组遍历数组。这些将是输出数组的关键值。之后,它遍历包含很多对象的数组。这些对象有一个属性“类别”。其中一些有一个,另外一个有。所以用循环遍历所有类别。

如果类别与id相同,则应将对象推送到var objs,var objs将添加到右键。

这是所有的工作,但是,我希望对象只有一个类别保存。所以我在最后一个循环内部声明了一个新的变量,将obj放在那里并设置obj.category。不幸的是,这是覆盖'source',数组[x] .category。这是不好的,因为这会发生这样的问题,即具有两个类别的对象只能在该函数中找到一次,并且必须找到两次,因此可以保存两次(每次表示键值一次)。

很多解释为一个小片的代码...

$.each(unique_id, function(i, el){ 
    var objs = []; 

    for(var x in array) 
    { 
     for(var j=0; j<array[x].category.length; j++) 
     { 
      if(array[x].category[j] == el) 
      { 
       var obj = array[x]; 
       obj.category = el; 
       objs.push(obj); 
      } 
     } 
    } 
    data[el] = objs; 
}) 

回答

1

正在发生的事情是:既OBJ和阵列[X]都指向同一个对象。他们是两个引用指向同一个对象。可以尝试以下:

 $.each(unique_id, function(i, el){ 
      var objs = []; 

      for(var x in array) 
      { 
       for(var j=0; j<array[x].category.length; j++) 
       { 
        if(array[x].category[j] == el) 
        { 
         var obj = {}; 
         $.extend(true,obj,array[x]); 
         obj.category = el; 
         objs.push(obj); 
        } 
       } 
      } 
      data[el] = objs; 
    }); 

此外,在JavaScript变数函数范围的,所以即使你声明它们的内环内,他们在整个功能,不仅是可见在你已经定义它的内部循环中。当然$ extend会复制array [x]上存在的每个属性以及嵌套对象及其属性。如果你不想要的话。只是用

 var obj = {}; 
     obj.category = array[x].category; 

提供的类别也不是对象。

+0

谢谢!现在工作。并感谢您的解释。时间阅读更多关于这个我认为,将在未来拯救我:-) #happystudent – user3346696

+0

不客气 –