2013-03-21 104 views
2

我的javascript代碼;Array in Array in JSON

function callDist(sel) 
{ 
    $.getJSON('Dist.json', function(data){ 
    var $container = $('#parameters').empty(); 

    $.each(data.distributions, function(i, distribution){ 
     $.each(distribution, function(key,value) 
     { 
      if(distribution.type==sel.value) { 
      alert(distribution.name); 
      $.each(distribution.parameters, function(key, value) { 
      $container.append(key + ':' + value + '<br />'); 
      $container.append('<hr />'); 
      }); 
     } 
    }); 
} 
); 
}); 
} 

我的Json代碼;

{ 
"distributions":[ 
    { 
    "name":"Uniform", 
    "type":1, 
    "parameters":[{ "minValue":2 , "maxValue":4 }] 
    }, 
    { "name":"Normal", 
    "type":2, 
    "parameters":[{ "mean":5 , "standartDeviation":3 }] 
    }, 
    { 
    "name":"Exponential", 
    "type":3, 
    "parameters":[{"lamda":2}] 
    }, 
    { 
    "name":"Geometric", 
    "type":4, 
    "parameters":[{"probability":0.2}] 
    } 
] 
} 

Html code;

<select name="selectDistribution" class="span12" id="Options"  

onchange="callDist(this);" > 
     <option value="0">Choose one distribution</option> 
     <option value="1">Uniform</option> 
     <option value="2">Normal</option> 
     <option value="3">Exponential</option> 
     <option value="4" >Geometric</option> 
</select> 

JSON中存在這樣一些distributions.when用戶從選擇選項選擇它們中的一些我觸發callDist(SEL)函數創建的陣列。 當傳遞的值sel等於distribution.type時,我想將該分佈的參數寫入div。如何才能做到這一點?謝謝。

+2

永遠不要調用變量'JSON',因爲它會覆蓋原生的'JSON'對象。你有什麼努力去完成你的任務? – MaxArt 2013-03-21 15:34:07

+0

'sel.value'應該是什麼? – 2013-03-21 15:36:39

+0

@MaxArt我改變了它,但它仍然沒有解決。 – ntf 2013-03-21 15:37:12

回答

2
function callDist(sel) { 
    $.getJSON('Dist.json', function(json){ 
     var $container = $('#parameters').empty(); 


     $.each(json.distributions, function(i, distribution) { 
      if(distribution.type==sel.value) { 
       $.each(distribution.parameters, function(j, parameters) { 
        $.each(parameters, function(parameter_key, parameter_value) { 
         $container.append(parameter_key + ':' + parameter_value + '<br />'); 
         $container.append('<hr />'); 
        }); 
       }); 
      } 
     }); 
    }); 
} 
+0

看起來確實如此,但這一次,沒有輸出。 – ntf 2013-03-21 15:46:05

+0

控制檯中的任何錯誤? – 2013-03-21 15:47:43

+0

我運行我的項目從wamp和localhost.And沒有錯誤。只有參數的div標籤現在是空的。 – ntf 2013-03-21 15:49:35

-1

$.each(data.distributions, function(i, distribution,) { 
+0

我改變了它,但是這個我三次得到0:[object Object]。 – ntf 2013-03-21 15:42:28

+0

請訪問我在http://jsfiddle.net/jagzviruz/P75R8/1/ – jagzviruz 2013-03-21 15:57:48

+0

創建的小提琴,但我可以只用您的解決方案獲取發行版的名稱。 – ntf 2013-03-21 16:00:45

1

刪除第二個逗號,distributions設置爲一個數組,你會通過發行具有循環和檢查,看看是否每個元素的type值匹配sel和然後將該對象的參數追加到所討論的div中,除非位置總是轉換爲某種類型。如果是這樣的話,就像

var distribution = data[(sel-1)] 

可用於設置分佈。

可能更有意義的內容,因爲可能存在的數組中的位置不對應類型的情況下,就是要調整你的JSON,讓你有一個對象,而不是一個數組,如下所示:

{"distributions":{ 
    "Uniform":{ 
     "name":"Uniform", 
     "type":1, 
     "parameters":[{ "minValue":2 , "maxValue":4 }] 
    }, 
    "Normal":{ 
     "name":"Normal", 
     "type":2, 
     "parameters":[{ "mean":5 , "standartDeviation":3 }] 
    } 
    } 
} 

在這種情況下,我使用了name字段作爲distributions對象的屬性名稱,可以通過鍵入data[selName].parameters,其中selName是對應於選擇的名字讓我對於任何給定的分佈狀態參數,但你可以就像使用屬性名稱一樣輕鬆使用類型。

這兩種方法都不需要循環訪問數據。

0

我繞着它做了一個小提琴here。我能夠以正確的值查看警報。 我用

$('#Options').change() 

觸發功能和其他一些修改,以在撥弄工作。

+0

我想獲得想要的分佈的參數。並且我想將參數寫入參數div – ntf 2013-03-21 16:03:55