2012-04-12 139 views
1

我从服务器接收像下面这样的JSON:转换JSON多维JavaScript数组

{"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"} 

谁编码这个曾经JSON_FORCE_OBJECT作为PHP的json_encode方法的参数的开发商。

在JavaScript中是否有任何“魔法”(即不是自定义函数)将此结构转换为多维数组?

我想是这样的:

[["image1.jpg","texthere","2"],["image66.jpg","texthere","1"]]... 

免责声明: - 我在寻找本地实现(不JQuery的); - PHP可以最终更改(如果需要);

任何帮助表示赞赏,在此先感谢。

+1

好吧,一个简单的方法就是告诉开发者不要强迫它成为一个对象并以正确的方式构建它。什么更耗时?改变那个标志,或建立代码来转换它? – Joseph 2012-04-12 10:18:05

+0

@Joseph,我想你会发现写几行代码要比处理一个不称职的开发人员要快得多。 – 2012-04-12 10:52:31

+0

好的,除了“手动”添加(在PHP中)包含键数的长度键之外,还有其他方法可以计算JSON中存储了多少个数组吗? – Battery 2012-04-12 10:53:34

回答

0

我能想到的最简单的方法就是使用正则表达式将JSON从对象字面值转换为数组字面值。

不幸的是,西蒙考威尔比这种方法更神奇。

//I don't know why you don't want a custom function. 
function dataToArray(data) 
{ 
    data = data.replace(/"[0-9]+":/g,"");   //Remove all index keys 
    data = data.replace(/,"length":"[0-9]+"/g,""); //Remove length key-value pair 
    data = data.replace(/{/g,"[");     //Change the left brackets 
    data = data.replace(/}/g,"]");     //Change the right brackets 

    return JSON.parse(data); 
} 
+0

Andrew首先感谢“无能”:-)第二件事:我认为有一些CPU密集度较低,因为我在移动环境中使用JS框架(这意味着更少的内存资源)。第三个想法:我认为有一种方法可以计算JSON中的元素。无论如何,人们会问一些事情,因为他想学习更多东西,而不是让你失去时间。 – Battery 2012-04-12 10:58:16

+0

我不叫你无能!!! D:只需编写服务器端代码的人!除非你在第三人称中提及自己。而且我认为你会发现手机的CPU和RAM功能可以实际执行javascript,这足以计算出正则表达式,这实际上是非常有效且简单的计算方式。如果有的话,它解析JSON,你应该担心! – 2012-04-12 11:00:34

+0

哦,对不起:-)我以为它被转介给我。问题在于“无能”产生了巨大的JSON,我试图通过消除内键来减少损害。感谢您的回复,并再次抱歉。 – Battery 2012-04-12 11:36:53

0

并不神奇,但您可以遍历数据并测试它具有的值的类型。

一个基本的例子如下。它没有检查我想要的生产代码中的错误。

var data = {"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"}; 

function data_to_array(data) { 
    var array = []; 
    for (var key in data) { 
     var value = data[key]; 
     if (typeof value === 'string') { 
      array[key] = value; 
     } else { 
      array[key] = data_to_array(value); 
     } 
    } 
    return array; 
} 

var array = data_to_array(data); 
console.log(array); 

确保您添加hasOwnProperty检查您的对象原型是否可能会混淆。您应该也可以添加一个检查以确保只有整数键被添加到数组中。

0

没有内置功能。如果你有JSON字符串,你可以做字符串替换,否则你必须循环如下。

var dataObject = {"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"}; 

function getArray(object){ 
    var array = []; 
    for(var key in object){ 
     var item = object[key]; 
     array[parseInt(key)] = (typeof(item) == "object")?getArray(item):item; 
    } 
    return array; 
} 

var dataArray = getArray(dataObject);