繁体   English   中英

Javascript合并并重命名Json对象

[英]Javascript merge and rename Json objects

这里的简单问题是:我想合并两个Json对象,同时重命名第二个。

第一个数组(obj1):

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

第二个数组(obj2):

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

所需结果:

[  
   {  
      "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
   }
]

所以我尝试了:

重命名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;
}

然后,我尝试使用以下方法合并它们:

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;

}

我的问题最肯定是在上面的函数中,因为它只返回obj2(这在我对output [i]进行两次迭代时很有意义),但是我如何才能进入并仅更改键->值?

我建议您像这样定义一个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;
};

然后使用它将数组压缩在一起,如下所示:

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

正如您所说的,功能就是问题。

每个对象需要两个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;
}

试试这个,我确定您真正想要的是什么,但是我只是将答案基于您想要的输出

 <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