2015-11-14 81 views
1

这是我的代码JavaScript的每个覆盖数组对象

$(function() { 
    var sqlTable = [ 
    { 
     name: 'a', 
     TagName: 'a_1' 
    }, 
    { 
     name: 'b', 
     TagName: 'b_1' 
    } 
    ]; 

    var hbaseTable = [ 
    { 
     TagName: 'a_12015', 
     Tvalue: '1' 
    }, 
    { 
     TagName: 'a_12016', 
     Tvalue: '2' 
    }, 
    { 
     TagName: 'b_12015', 
     Tvalue: '1' 
    }, 
    { 
     TagName: 'b_12016', 
     Tvalue: '3' 
    } 
    ]; 

    var new_result = temp(sqlTable, hbaseTable); 

    function temp(a, b) { 
    var new_result2 = []; 
    var k = 0; 

    for (var i=0; i<a.length; i++) { 
     var sql_value = a[i]; 
     var tag_name = sql_value.TagName; 

     for (var j=0; j<b.length; j++) { 
     var hbase_value = b[j]; 
     var hbase_tag = hbase_value.TagName; 
     var hbase_tvalue = ''; 
     var hbase_tag_name = ''; 

     console.log('/', hbase_tag + ', ' + tag_name); 
     if (hbase_tag.indexOf(tag_name) > -1) 
     { 
      var t_sql_value = sql_value; 
      hbase_tvalue = hbase_value.Tvalue; 
      hbase_tag_name = hbase_value.TagName; 
      t_sql_value.hbase_tvalue = hbase_tvalue; 
      t_sql_value.hbase_tag_name = hbase_tag_name; 
      new_result2.push(t_sql_value); 
      k++; 
     } 
     } 
    } 

    return new_result2; 
    } 

    console.log('new_result', new_result); 
}); 

我想结果是

0: Object 
    TagName: "a_1" 
    hbase_tag_name: "a_12016" 
    hbase_tvalue: "1" 
    name: "a" 
__proto__: Object 
1: Object 
    TagName: "a_1" 
    hbase_tag_name: "a_12016" 
    hbase_tvalue: "2" 
    name: "a" 
__proto__: Object 
2: Object 
    TagName: "b_1" 
    hbase_tag_name: "b_12016" 
    hbase_tvalue: "1" 
    name: "b" 
__proto__: Object 
3: Object 
    TagName: "b_1" 
    hbase_tag_name: "b_12016" 
    hbase_tvalue: "3" 
    name: "b" 

但我送花儿给人得到的结果是

0: Object 
    TagName: "a_1" 
    hbase_tag_name: "a_12016" 
    hbase_tvalue: "2" 
    name: "a" 
__proto__: Object 
1: Object 
    TagName: "a_1" 
    hbase_tag_name: "a_12016" 
    hbase_tvalue: "2" 
    name: "a" 
__proto__: Object 
2: Object 
    TagName: "b_1" 
    hbase_tag_name: "b_12016" 
    hbase_tvalue: "3" 
    name: "b" 
__proto__: Object 
3: Object 
    TagName: "b_1" 
    hbase_tag_name: "b_12016" 
    hbase_tvalue: "3" 
    name: "b" 

这是我JSFiddle

+0

我相信这是因为对象引用变量。所以'b [j]'将保存最后一个值。 – Rajesh

回答

1

问题是,你觉得你克隆一个对象时,你实际上只是创建一个新的参照同一个对象在这两个突出以下行:

function temp(a, b) { 
    var new_result2 = []; 
    var k = 0; 

    for (var i=0; i<a.length; i++) { 
     var sql_value = a[i];     ////////// ERROR 1 
     var tag_name = sql_value.TagName; 

     for (var j=0; j<b.length; j++) { 
     var hbase_value = b[j]; 
     var hbase_tag = hbase_value.TagName; 
     var hbase_tvalue = ''; 
     var hbase_tag_name = ''; 

     console.log('/', hbase_tag + ', ' + tag_name); 
     if (hbase_tag.indexOf(tag_name) > -1) 
     { 
      var t_sql_value = sql_value;  ////////// ERROR 2 
      hbase_tvalue = hbase_value.Tvalue; 
      hbase_tag_name = hbase_value.TagName; 
      t_sql_value.hbase_tvalue = hbase_tvalue; 
      t_sql_value.hbase_tag_name = hbase_tag_name; 
      new_result2.push(t_sql_value); 
      k++; 
     } 
     } 
    } 

    return new_result2; 
    } 

如果检查后您sqlTable原始代码运行,你会发现它的功能严重损坏。

为了解决这个问题,真的克隆通过改变各行的上面:

var sql_value = { name: a[i].name, TagName: a[i].TagName };    // ERROR 1 
var t_sql_value = { name: sql_value.name, TagName: sql_value.TagName }; // ERROR 2