结合JSON阵列

结合JSON阵列

问题描述:

我有3个JSON阵列,每个具有以相同的格式列出的信息:结合JSON阵列

Array: 
    ID: 
    NAME: 
    DATA: 

    ID: 
    NAME: 
    DATA: 

    etc... 

我的目标是通过将3至所有3个阵列组合成一个阵列,并且通过名称排序和显示数组转换成函数。

我已经试过的功能是:

JavaScript调用:

// to save time I'm just passing the name of the array, I've tried passing 
// the full array name as json[0]['DATA'][array_1][0]['NAME'] as well. 

combineNames(['array_1','array_2']); 

功能:以上

function combineNames(names) { 

    var allNames = [] 

    for (i=0;i<names.length;i++) { 
     for (j=0;j<json[0]['DATA'][names[i]].length;j++) { 
      allNames.push(json[0]['DATA'][names[i]][j]['NAME']); 
     } 
    } 

    return allNames.sort(); 
} 

给我的错误是名称为null或未定义。

我也使用array.concat功能,工作时尝试我硬编码:

var names = []; 
var allNames = []; 

var names = names.concat(json[0]['DATA']['array_1'],json[0]['DATA']['array_2']); 

for (i=0;i<names.length;i++) { 
    allNames.push(names[i]['NAME']); 
} 

return allNames.sort(); 

但我无法弄清楚如何在数组传递到函数(如果可能的话我想只传递数组名称部分,而不是整个json [0] ['DATA'] ['array_name'],就像我试图在第一个函数中做的那样...

+1

你有JSON阵列? 它看起来像JSON中的一个畸形。 – CodeJoust 2010-05-12 19:26:23

+0

不幸的是,阵列中的数据不是我的分享,所以我只能给出结构。 – Choy 2010-05-12 19:35:05

+0

你可以改变数据或什么?你让我惊讶于这个结构是什么。我正在沿着3个数组的行进行可视化,每个数组都包含如下内容:'[{“id”:1,“name”:“Bob”,“data”:1},{“id”:2, “:”Fred“,”data“:2}]'。我在正确的轨道上吗? – Matt 2010-05-12 19:59:11

如果你有3个数组是这样的:

[{ "id":1, "name":"Bob", "data":1},{ "id":2, "name":"Fred", "data":2 }] 

简单地做:

function combine() { 
    var ar = []; 

    return ar.concat.apply(ar, arguments).sort(function (a, b) { 
     var aName = a.NAME; 
     var bName = b.NAME; 
     if (aName < bName) { 
      return -1; 
     } else if (aName == bName) { 
      return 0; 
     } else { 
      return 1; 
     }; 
    }); 
}; 

然后调用它像:

var jointArrays = combine(array1, array2, array3, ...); 

但是,如果你的JSON看起来像这样:

json[0]['DATA'][array_1] 
json[0]['DATA'][array_2] 
json[0]['DATA'][array_3] 

你可以简单地定义combine()如下,这将是更方便:

function combine(arrays) { 
    var ar = []; 

    return ar.concat.apply(ar, arrays).sort(function (a, b) { 
     var aName = a.NAME; 
     var bName = b.NAME; 
     if (aName < bName) { 
      return -1; 
     } else if (aName == bName) { 
      return 0; 
     } else { 
      return 1; 
     }; 
    }); 
}; 

然后调用它像:

var jointArrays = combine(json[0].DATA); 

如果你想只是名称的数组,而不是物体,请使用以下内容:

function combine(arrays) { 
    var ar = [], 
     ret = []; 

    ar = ar.concat.apply(ar, arrays); 

    for (var i=0;i<ar.length;i++) { 
     ret.push(ar.NAME); 
    }; 

    return ret.sort(); 
}; 

Javascript is case sens itive;确保它是DATA而不是dataNAME而不是name

现在有一点家务。

在你的例子中,你的两个计数器变量都被声明为“隐含的全局变量”,因为你不用var语句(and implied globals are bad)作为它们的前缀。您应该使用:

for (var i=0;i<something.length;i++) { 
    // 
}; 

而不是忽略var

另外, “{}” 创建对象。 “[]”创建一个数组。 Javascript不支持关联数组;例如数组的键除了数字之外都是其他键。你是JSON返回的是一个对象数组

“方形记号”和“点记法”是可以互换的。 object["one"]相当于object.one

当密钥存储为变量或访问数组时,通常使用方形表示法。

var key = "one"; 
object[key] 

希望这会有所帮助。

allNames(['array_1','array_2']); 

似乎工作:

+0

谢谢马特。当你说它叫做array1,array2时,你的意思是完整的json [0] ['DATA'] ['array1']?当我这样做,我得到[对象,对象] [对象,对象],等等... – Choy 2010-05-12 20:14:06

+0

@George:你应该这样做:'结合(JSON [0] .DATA [array_one],JSON [0] .DATA [array_two ])',但请参阅我的编辑以获得更好的解决方案('combine(json [0] .DATA)')。 – Matt 2010-05-12 20:21:43

+0

感谢您的帮助。特别是指出“房子清洁”的东西。我认为你的功能只有一步之遥。我仍然得到[object,object],这可能只是对我的json数组的层次结构的误解。无论如何,我原来的功能现在可以在@ _ @ – Choy 2010-05-12 20:45:42

您被重新声明allNames变量,清空它。

试试这个:

function combineNames(names) { 
var allNames = []; 
var data = json[0]['DATA']; 
for (arrnames in data) { 
    for (j=0;j<data[arrnames].length;j++) { 
     if ('NAME' in data[arrnames]){ 
      allNames.push(data[arrnames]['NAME']); 
     } 
    } 
} 
return allNames.sort(); 
} 
+0

不知道我在哪里重新声明allNames var?我在代码的for(j = 0; j Choy 2010-05-12 19:46:44

+0

好的......当您编写'var names = [];'时,您重新声明了名称变量,它将覆盖作为空数组传递给函数的名称数组。 – CodeJoust 2010-05-12 19:49:23

+0

哦,对,删除它在我刚刚发布的代码中。虽然我的问题仍然是一样的。当我通过注释掉for循环来测试它并返回names.length时,我得到3(我传入的数字或数组)。当我返回json [0] ['DATA'] [names [0]]。length时,我在第一个数组中得到了正确的名字数,当我返回json [0] ['DATA'] [names [0] ] [0] ['NAME']我在第一个数组中获得名字。这是当我把它放在for循环中并尝试返回allNames时,它被搞砸了。感谢您一直以来的帮助。 – Choy 2010-05-12 19:56:02

function allNames(names) { 

var allNames = []; 

for (var i=0;i<names.length;i++) { 
    for (var j=0;j<json[0]['DATA'][names[i]].length;j++) { 
     allNames.push(json[0]['DATA'][names[i]][j]['NAME']); 
    } 
} 

return allNames.sort(); 

} 

使用调用。

你可以用jQuery轻松组合JSON:

var x ={ a:1, b:2 }; 
var y ={ a:2, c:3 }; 
var z ={ b:3, d:4 }; 

$.extend(x, y, z); 

console.dir(x); // now 'x' is all of them combined