结合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'],就像我试图在第一个函数中做的那样...
如果你有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
而不是data
和NAME
而不是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']);
似乎工作:
谢谢马特。当你说它叫做array1,array2时,你的意思是完整的json [0] ['DATA'] ['array1']?当我这样做,我得到[对象,对象] [对象,对象],等等... – Choy 2010-05-12 20:14:06
@George:你应该这样做:'结合(JSON [0] .DATA [array_one],JSON [0] .DATA [array_two ])',但请参阅我的编辑以获得更好的解决方案('combine(json [0] .DATA)')。 – Matt 2010-05-12 20:21:43
感谢您的帮助。特别是指出“房子清洁”的东西。我认为你的功能只有一步之遥。我仍然得到[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();
}
不知道我在哪里重新声明allNames var?我在代码的for(j = 0; j Choy 2010-05-12 19:46:44
好的......当您编写'var names = [];'时,您重新声明了名称变量,它将覆盖作为空数组传递给函数的名称数组。 – CodeJoust 2010-05-12 19:49:23
哦,对,删除它在我刚刚发布的代码中。虽然我的问题仍然是一样的。当我通过注释掉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
你有JSON阵列? 它看起来像JSON中的一个畸形。 – CodeJoust 2010-05-12 19:26:23
不幸的是,阵列中的数据不是我的分享,所以我只能给出结构。 – Choy 2010-05-12 19:35:05
你可以改变数据或什么?你让我惊讶于这个结构是什么。我正在沿着3个数组的行进行可视化,每个数组都包含如下内容:'[{“id”:1,“name”:“Bob”,“data”:1},{“id”:2, “:”Fred“,”data“:2}]'。我在正确的轨道上吗? – Matt 2010-05-12 19:59:11