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

Javascript/jQuery: nesting loops, prevent overwriting object property

本文关键字:覆盖 对象 属性 jQuery 嵌套循环 Javascript      更新时间:2023-09-26

我有一个函数,应该用键建立一个数组。这些键将有一系列对象作为值。

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

函数循环遍历带有Id的数组。这些将是输出数组的键值。之后,它循环遍历一个包含许多对象的数组。那些对象有一个属性" category "有些人有一个,有些人有更多。对于for循环,我循环遍历所有的类别。

如果类别与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;
})

实际情况是: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将复制数组[x]上存在的每个属性,以及嵌套的对象及其属性。如果你不想这样。只需使用

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