【问题标题】:Javascript/jQuery: nesting loops, prevent overwriting object propertyJavascript/jQuery:嵌套循环,防止覆盖对象属性
【发布时间】:2014-04-19 10:54:47
【问题描述】:

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

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

函数循环遍历具有 ID 的数组。这些将是输出数组的键值。之后,它会遍历一个包含很多对象的数组。这些对象具有属性“类别”。有些人有一个,有些人有更多。因此,我使用 for 循环遍历所有类别。

如果类别与 id 相同,则应该将对象推送到 var objs,这将添加到正确的键中。

这一切正常,但是,我希望对象只保存一个类别。所以我在最后一个循环中声明了一个新的 var,把 obj 放在那里并设置 obj.category。不幸的是,这覆盖了“源”,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;
})

【问题讨论】:

    标签: javascript jquery for-loop overwrite nested


    【解决方案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;
    

    提供的类别也不是对象。

    【讨论】:

    • 谢谢!现在工作。谢谢你的解释。是时候阅读更多关于这方面的内容了,我认为这会在未来拯救我 :-) #happystudent
    猜你喜欢
    • 2015-12-29
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2011-07-08
    • 2017-12-25
    • 2015-02-22
    相关资源
    最近更新 更多