2013-03-21 103 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