简体   繁体   English

Javascript合并并重命名Json对象

[英]Javascript merge and rename Json objects

Simple problem here: 2 Json objects I would like to merge, while renaming the second. 这里的简单问题是:我想合并两个Json对象,同时重命名第二个。

First Array (obj1): 第一个数组(obj1):

[  
   {  
      "name":"Metric 1",
      "value":33731487,
   },
   {  
      "name":"Metric 2",
      "value":11252893,
   }
]

Second Array (obj2): 第二个数组(obj2):

[  
   {  
      "name":"Metric 1",
      "value":118181851,
   },
   {  
      "name":"Metric 2",
      "value":15151,
   }
]

Desired Result: 所需结果:

[  
   {  
      "name":"Metric 1", // Obj1
      "value":118181851, // Obj1
      "name_compare":"Metric 1", // Obj2
      "value_compare":148748, // Obj2
   },
   {  
      "name":"Metric 2", // Obj1
      "value":15151, // Obj1
      "name_compare":"Metric 2", // Obj2
      "value_compare":741178, // Obj2
   }
]

So I tried: 所以我尝试了:

Renaming the Obj2 (works ok): 重命名Obj2(可以正常运行):

function JsonRename(obj) {
    var output = {};
    for (i in obj) {
        if (Object.prototype.toString.apply(obj[i]) === '[object Object]') {
            output[i] = JsonRename(obj[i]);
        } else {
            output[i+'_compare'] = obj[i];
        }
    }
    return output;
}

I've then tried to merge them by using: 然后,我尝试使用以下方法合并它们:

function JsonMergeCompare(obj1, obj2 ) {

  var renamed_obj2 = JsonRename(obj2);

  var output = {};
  for (i in obj1) {

    output[i] = obj1[i];
    output[i] = renamed_obj2[i];

  }

  return output;

}

My problem is most certainly in the function above, because it only returns the obj2 (which makes sense as I'm iterating over output[i] twice) but how can I get in and change only the key -> values? 我的问题最肯定是在上面的函数中,因为它只返回obj2(这在我对output [i]进行两次迭代时很有意义),但是我如何才能进入并仅更改键->值?

I suggest you to define an Array.zip() function like this: 我建议您像这样定义一个Array.zip()函数:

Array.zip = function(left, right, combinerFunction) {
    var counter, results = [];

    for(counter = 0; counter < Math.min(left.length, right.length); counter++) {
        results.push(combinerFunction(left[counter], right[counter]));
    }

    return results;
};

And then use it to zip the arrays together like this: 然后使用它将数组压缩在一起,如下所示:

var resultArray = Array.zip(array1, array2, function(one, two) {
    return {
        name: one.name, 
        value: one.value,
        name_compare: two.name, 
        value_compare: two.value
    };
});

As you say the function is the problem. 正如您所说的,功能就是问题。

You need two for loops one per object as follows: 每个对象需要两个for循环,如下所示:

function JsonMergeCompare(obj1, obj2 ) {

  var renamed_obj2 = JsonRename(obj2);

  var output = {};
  for (i in obj1)
    output[i] = obj1[i];
  for (i in renamed_obj2)
    output[i] = renamed_obj2[i];
  return output;
}

try this one, I'm sure what is really you want but I just based my answer in your desired output 试试这个,我确定您真正想要的是什么,但是我只是将答案基于您想要的输出

 <script> //First Array (obj1) var _obj1=[ { "name":"Metric 1", "value":33731487, }, { "name":"Metric 2", "value":11252893, } ]; //Second Array (obj2): var _obj2=[ { "name":"Metric 1", "value":118181851, }, { "name":"Metric 2", "value":15151, }, { "name":"Metric 3", "value":123, }, ]; function jsonRename(obj1,obj2){ var out=[]; var keys={}; var ctr=0; var indx=0; for(v in obj1){ if(typeof(obj1[v].name)!="undefined" ){ var n=obj1[v].name; if( typeof(keys[n])=="undefined"){ out.push(obj1[v]); keys[n]=out.length-1; } for(v1 in obj2){ try{ if(n==obj2[v1].name){ ctr++; out[keys[n]]["name_compare"+ctr]= obj2[v1].name; out[keys[n]]["value_compare"+ctr]= obj2[v1].value; } }catch(e){} } } } return out; } var out=jsonRename(_obj1,_obj2); </script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM