如何使用jquery按值复制对象

时间:2012-06-19 14:27:44

标签: javascript jquery

您好我在使用此复选框时出现问题:

<input type="checkbox" id="hideTempSeries" checked="checked" value="0" /> 
     Temperature <br />
<input type="checkbox" id="hideFlowSeries" checked="checked" value="1" /> 
     Flow <br />
<input type="checkbox" id="hidePressSeries" checked="checked" value="2"/> 
     Pressure <br /> 
<input type="checkbox" id="hideCondSeries" checked="checked" value="3" /> 
     Conductivity  <br />

..这个jQuery函数将这个复选框值的数组发送给一个名为的函数  removePanes(checkedArray)“每次复选框都已更改”

   $("#tools :checkbox").change(function(){
       if($(this).prop('checked')){// when Checked

       }
       else{// when unChecked
       var checkedArray = [] ; 
        $("#tools :checkbox").each(function(index,value){
           if($(this).prop('checked') == false){checkedArray.push($(this).val())}

        });
        removePanes(checkedArray) ;
       }

removePanes()函数

   function removePanes(id){
       var removeUncheckedSeries = $.map(newSeries , function(index,value){
        for(var i=0 ; i < id.length ; i++){  
            if(index.yAxis == id[i])return null;
        }  
       return index ;
       });
       var modified = $.map(removeUncheckedSeries, function(index,value) {
        index.yAxis = 15 ; 
        return index ;
       });
      console.log(modified) ;
    } ; 

这是newSeries[] Object

然后removePanes(checkedArray)函数获取此数组并从以下内容中删除与未经检查的值等效的所有对象:newSeries[] object

然后它将所有yAxis值设置为15。

此功能无效。

因为每次更改复选框时,函数都不会重新加载newSeries []对象,它只会在最后一次更改时对其进行修改。

它所做的是,第一次点击正常工作,然后将其所有的Y轴设置为15。当我未选中,因为所有的Y轴等于15和jQuery的阵列发送值从0到3什么都没有发生任何其他框。< / p>

问题:每次复选框触发时,如何使用removePanes(checkedArray)对象重新加载newSeries[]

1 个答案:

答案 0 :(得分:3)

  

这种情况正在发生,因为默认情况下,对象是通过引用复制的   在Javascript。

因此,如果您从任何地方更改复制对象的任何属性,它将影响所有其他属性。要仅按值(或克隆)复制对象,您可以使用jQuery的$.extend()方法,如Jonh Resig(是他自己)在此处显示https://stackoverflow.com/a/122704/344304

var newObj = $.extend(true, {}, oldObj); // deep copy

因此请更改您的removePanes功能,如下所示

function removePanes(id) {
        var seriesCopy = jQuery.extend(true, {}, newSeries);
        var removeUncheckedSeries = $.map(seriesCopy, function(obj, index) {
            return   $.inArray(obj.yAxis,id) == -1 ? obj : null;
        });
        var modified = $.map(removeUncheckedSeries, function(obj, index) {
            obj.yAxis = 15;
            return obj;
        });
        console.log(modified);
    };​

演示: http://jsfiddle.net/joycse06/w2KS2/