javascript每次覆盖数组对象

标签 javascript arrays

这是我的代码

$(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

最佳答案

问题在于,您认为自己正在克隆一个对象,而实际上您只是在下面突出显示的两行中创建对同一对象的新引用:

  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

关于javascript每次覆盖数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33705485/

相关文章:

c - 声明一个二维字符串数组

c - 声明大型全局数组

arrays - Google Sheets 公式将列添加到数组?

javascript - 使用 innerText 或 innerHTML 不会显示文本

javascript - 如何通过多个 $.ajax 调用实现异步计算可观察值?

php - 在 jQuery 即时搜索脚本中使用 PHP 而不是 JSON

javascript - 为什么我的图片库无法使用?

java - 我无法从数组中返回值

JavaScript onload 和 onerror 未被调用

javascript - jQuery:对于输入元素的每个属性,如何获取该输入元素的名称?