2015-11-14 3 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 
Смежные вопросы