2015-05-12 70 views
2

假設我有兩個JSON字符串:如何在JSON加入的數據之間執行操作?

json1 = [{"hc-key":"ar-tf","value":221},{"hc-key":"ar-ba","value":10820},{"hc-key":"ar-sj","value":230}] 

json2 = [{"hc-key":"ar-ba","value":2890151},{"hc-key":"ar-sj","value":15625084},{"hc-key":"ar-tf","value":367828}] 

什麼,我想要做的是加入他們「HC-鍵」,進入一個新的JSON字符串,其中新「值」是將json1中的值除以json2中的值的結果。在JavaScript中。

請注意,json2中的數據與json1中的數據的順序不同,但它們都具有完全相同的密鑰。

產生的JSON應該是:

result = [{"hc-key":"ar-ba","value":10820/2890151},{"hc-key":"ar-sj","value":230/15625084},{"hc-key":"ar-tf","value":221/367828}] 

(我中省略澄清的結果值)

感謝。

+6

您不操縱json字符串。將字符串解碼爲本地數組/對象,合併它們,然後重新編碼爲json。 json的基本上是一個傳輸/包裝格式,並不打算被操縱。 –

+0

根據我的經驗,在發送給客戶端之前,連接在服務器端更好。然而,有時候你會強迫它做客戶端,這不是一個簡單的編程任務。也就是說,你可能想查看一些JavaScript數據庫,如[Lawnchair](http://brian.io/lawnchair/)。這些不是真正解決您的問題的方法,但它們可能會給您一些想法。 – Roberto

+0

感謝您的意見。事實上,兩個JSON字符串都在DB中,因此可以使用Newtonsoft.JSON來操縱服務器端。我認爲這是正確的做法。我也會在C#中提出建議。 – nlopedebarrios

回答

3

羅伯特是正確的,連接是更好的服務器端,但你想要做的只是使用一些JavaScript循環。

我沒有爲這個例子的錯誤處理打擾,但我也建議在分割之前確認你有實數,並且你沒有被零除。

var json1 = [ 
 
    {"hc-key":"ar-tf","value":221}, 
 
    {"hc-key":"ar-ba","value":10820}, 
 
    {"hc-key":"ar-sj","value":230}]; 
 

 
var json2 = [ 
 
    {"hc-key":"ar-ba","value":2890151}, 
 
    {"hc-key":"ar-sj","value":15625084}, 
 
    {"hc-key":"ar-tf","value":367828}]; 
 

 
var result = []; 
 

 
for(var i = 0; i < json1.length; i++) 
 
{ 
 
    var key = json1[i]['hc-key']; 
 
    for(var j = 0; j < json2.length; j++) { 
 
     if(json2[j]['hc-key'] == key) { 
 
      result.push({ 
 
       "hc-key":key, 
 
       "value": json1[i]['value']/json2[j]['value'] 
 
      }); 
 
      break; 
 
     } 
 
    } 
 
} 
 
    
 
//show results 
 
var key, value; 
 
var $results = $('.results tbody'); 
 

 
for(var i = 0; i < result.length; i++) 
 
{ 
 
    key = result[i]['hc-key']; 
 
    value = result[i]['value']; 
 
    $results.append('<tr><td>' + key + '</td><td>' + value + '</td></tr>'); 
 
}
td { 
 
    padding-right: 15px; 
 
    text-align: left; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<b>results:<b> 
 

 
<table class="results"> 
 
    <tbody></tbody> 
 
</table>

+0

謝謝@tellez,我用代碼片段試過了你的代碼,但它沒有顯示任何結果。此外,我嘗試在jsfiddle.net – nlopedebarrios

+0

打開JavaScript控制檯,然後運行代碼片段。 –

1

繼承人做一個功能性的方式。這種方式也適用於異步編程的observable。

Array.prototype.concatAll = function() { 
    var results = []; 
    this.forEach(function(subArray) { 
     results.push.apply(results, subArray); 
    }); 

    return results; 
}; 


result = json1.map(function(obj1) { 
    return json2. 
     filter(function(obj2) {return obj2["hc-key"] == obj1["hc-key"]}). 
     map(function(obj2) { 
     return { 
      "hc-key": obj1["hc-key"], 
      "value": obj1.value/obj2.value 
     }; 
    }); 
}).concatAll() 
+0

有趣的答案,因爲它解決了將數據通過線路異步組合的更大問題。這是一個單獨的問題,但這正是客戶端連接複雜性增長的原因。 – Roberto