2016-02-02 112 views
2

簡單的問題在這裏:2個Json對象我想合併,而重命名第二個。Javascript合併和重命名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; 

} 

我的問題是在上面的功能肯定的,因爲它只返回OBJ 2(這是有道理的,因爲我遍歷輸出[i]兩次),但我怎樣才能進入並只改變鍵 - >值?

+0

回答你能提供一個小提琴或plunkr? –

+0

爲什麼是-1?我認爲這是一個相當體面的問題! – nunorbatista

回答

4

我建議你這樣定義的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 
    }; 
}); 
+1

這一個很好,謝謝! – nunorbatista

1

正如你所說的功能是問題所在。

你需要兩個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; 
} 
0

試試這個,我確定你真的想要什麼,但我只是基於我在您需要的輸出

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

 
]; 
 
\t function jsonRename(obj1,obj2){ 
 
\t \t var out=[]; 
 
\t \t var keys={}; 
 
\t \t var ctr=0; 
 
\t \t var indx=0; 
 
\t \t for(v in obj1){ 
 
\t \t \t if(typeof(obj1[v].name)!="undefined"){ 
 
\t \t \t \t var n=obj1[v].name; 
 
\t \t \t \t if(typeof(keys[n])=="undefined"){ 
 
\t \t \t \t \t out.push(obj1[v]); 
 
\t \t \t \t \t keys[n]=out.length-1; \t 
 
\t \t \t \t } 
 
\t \t \t \t for(v1 in obj2){ 
 
\t \t \t \t \t try{ 
 
\t \t \t \t \t if(n==obj2[v1].name){ 
 
\t \t \t \t \t \t ctr++; 
 
\t \t \t \t \t \t out[keys[n]]["name_compare"+ctr]= obj2[v1].name; 
 
\t \t \t \t \t \t out[keys[n]]["value_compare"+ctr]= obj2[v1].value; 
 
\t \t \t \t \t } 
 
\t \t \t \t \t }catch(e){} 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t \t return out; 
 
\t } 
 
var out=jsonRename(_obj1,_obj2); 
 

 
</script>

+0

我的意思是我不確定你真的想要什麼.. – erfjax