2012-02-09 35 views
1

我想JQuery的数组,以重新安排JSON对象

 

    [ 
     "Data", 
      [ 
       "API", 
       "Apiales", 
       "Apiaceae", 
       "Apia", 
      ] 
     ] 

隐蔽这个JavaScript数组这种重排JSON格式

 

    [ 
    {"name":"API","id":"1"}, 
    {"name":"Apiales","id":"1"}, 
    {"name":"Apiaceae","id":"1"}, 
    {"name":"Apia","id":"1"} 
    ] 

感谢

更新: 我已经试过这

var aNewData =[]; 
      for(i in aData[1]){ 
      var item={}; 
      item.name = aData[1][i]; 
      item.id = "1"; 
      aNewData[i]=item; 
      } 
+0

而那些身份证是空空如也?或者他们只是从20开始数起来? – devnull69 2012-02-09 08:48:01

+0

身份证的只是作为一个例子,以了解如何与第二个关键相关的想法:如果需要,配对值,谢谢 – 2012-02-09 09:14:11

回答

3

ID从哪里来?测试下面的脚本,你的阵列是aData,结果将在aNewData

var aNewData = []; 
for (var i = 0; i < aData[1].length; i++) { 
    aNewData.push({ 
     "name": aData[1][i], 
     "id": 20 + i 
    }); 
} 

另见this example

+0

感谢scessor,它性能比我更新的解决方案更好吗? – 2012-02-09 09:15:27

+0

不客气。我们的解决方案之间应该没有性能差异。 – scessor 2012-02-09 09:20:23

+1

@JaideepSingh使用'for ... in'在数组上迭代并不是一个好习惯。使用简单的'for'作为* scessor *做的。 [阅读更多关于在SO上不使用'for ... in'的原因](http:// stackoverflow。COM /问题/ 500504/JavaScript的对合与阵列) – kapa 2012-02-09 09:20:56

0

你可以很容易地通过折叠变换的数据:

var sourceData = ["API","Apiales","Apiaceae","Apia"]; 
var transformed = sourceData.reduce(function(result, name, index) { 
    return result.concat({ 
    name: name, 
    id: 20 + index 
    }); 
}, []); 

这会给你基本上是相同的,因为对于scessor的循环,但在多个数据中心的方式。

认为它是这样的:

  1. 你把你的源数据(数组与所有这些“API *”的字符串)

  2. 您创建一个新的结果数组[](如第二传递参数为reduce),应将其作为下一个结果返回。

  3. 传递一个匿名函数来reduce将与3个参数来调用,每次的叫法,即result,这是您最近创建阵列,name每个那些“API *”的价值字符串,index ,它是原始数组内的那些字符串的索引。

  4. 您可以连续查看每个“api *”字符串,并将包含所需数据的新对象放入其中。由于result.concat将返回整个阵列,您只需添加那些

  5. 将返回包含所有数据的result数组。

但是为了以防万一你想成为向下兼容旧浏览器兼容,我建议使用underscore.js了点。

+0

谢谢,学到了很多东西从答案 – 2012-02-10 10:52:04

+0

这就是我所希望的。很高兴你可以利用它;) – Tharabas 2012-02-10 13:53:52