1

This is my code

$(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);
});

I want result is

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"

but I alway get the result is

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"

This is my JSFiddle

1
  • I believe it's because objects are reference variables. So b[j] will hold last value. Commented Nov 14, 2015 at 5:46

1 Answer 1

1

The problem is that you think you're cloning an object when you're in fact just creating a new reference to the same object in the two highlighted lines below:

  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;
  }

If you inspect sqlTable after your original code runs, you'll see it's badly defaced by your function.

To solve the problem, really clone by changing each of the lines above for:

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.