Javascript / jQuery:嵌套循环,防止覆盖对象属性

时间:2014-03-14 08:50:03

标签: javascript jquery for-loop overwrite nested

我有一个应该使用键构建数组的函数。这些键将具有一系列对象作为值。

我有一些相互嵌套的循环,我非常接近解决方案,但在最后一个循环中,我犯了一个错误,我无法看到解决方案。

具有Id&#39的数组上的函数loopt。这些将是输出数组的关键值。之后,它会循环遍历包含大量对象的数组。这些物品具有属性'类别'。他们中的一些人有一个,有些人更多。所以在所有类别中使用for循环I循环。

如果类别与id相同,那么它应该将对象推送到var objs,这将被添加到右键。

这一切都有效,但我希望对象只保存一个类别。所以我在最后一个循环中声明了一个新的var,将obj放在那里并设置了obj.category。不幸的是,这会覆盖' source',array [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 个答案:

答案 0 :(得分:1)

发生的事情是:obj和array [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;

提供的类别也不是对象。