2012-12-11 113 views
5

我有一个JSON看起来是这样的:JavaScript的转换或包装对象到数组复杂的JSON

var countries = [ 
{ 
    name: 'united states', 
    program: { 
       name: 'usprogram' 
      } 
}, 
{ 
    name: 'mexico', 
    program: { 
       name: 'mexico program' 
      } 
}, 
{ 
    name: 'panama', 
    program: [ 
      { 
       name: 'panama program1' 
      }, 
      { 
       name: 'panama program2' 
      } 
      ] 
}, 
{ 
    name: 'canada' 
} 
]; 

有没有一种办法总是包裹countries.programs对象到一个数组,使得最终的输出看起来是喜欢这个?我在underscoreJS中尝试了一些实用函数,但是这个解决方案已经避开了我。

var countries = [ 
{ 
    name: 'united states', 
    program: [ //need to wrap this object into an array 
      { 
       name: 'usprogram' 
      } 
      ] 
}, 
{ 
    name: 'mexico', 
    program: [ //need to wrap this object into an array 
      { 
       name: 'mexico program' 
      } 
      ] 
}, 
{ 
    name: 'panama', 
    program: [ 
      { 
       name: 'panama program1' 
      }, 
      { 
       name: 'panama program2' 
      } 
      ] 
}, 
{ 
    name: 'canada' 
} 
]; 

谢谢!

+0

你如何让你的JSON?或者只有当你访问它时才想将该成员转换为数组? – Sampson

+3

这不是JSON,那是Javascript对象和数组。 JSON是表示对象和数组的文本格式。 – Guffa

回答

18

不是自动的,没有。环通国家,然后country.program = [].concat(country.program)。如果它不是数组,则最后一块魔术将包装该值,并保持原样。大多。 (这将是一个不同的,但等效的阵列)。每个请求

编辑:

_.each(countries, function(country) { 
    country.program = [].concat(country.program); 
}); 
+0

我不确定你的意思。如果这样会起作用的话 – Kevin

+0

@Kevin:那你去吧 – Amadan

+2

这太棒了!谢谢澄清 – Kevin

1

像这样的东西可以工作

_.each(countries, function(country) { 
      ! _.isArray(country.program) && (country.program = [country.program]); 
        }); 
+0

这一个为我工作,但JSLint抛出此错误: 错误: 问题在第24行字符79:预计分配或函数调用,而是看到一个表达式。 ! _.isArray(country.program)&&(country.program = [country.program ... – Kevin

+0

@Kevin:这是一种风格投诉,程序仍然可以正常工作 – Amadan