0

我正在构建与远程服务的 javascript (nodejs) 集成。该服务返回格式不一致的结果,并且在 javascript 中,我正在努力确定如何根据响应切换我的格式。

两种格式如下所示,第一种是当 Parent 有一个孩子时,第二种是当 Parent 有 >1 个孩子时:

var single = { "Parent" : { "name" : "foo" } }
var multi = { "Parent" : [ { "name" : "foo" }, { "name" : "bar" } ] }

因此,当我尝试在 js 中解析结果,访问“name”的子属性时,会得到不一致的结果:

for (var i in single) {
    console.log("child name: " + single[i].name;
}

for (var i in multi.Parent) {
    console.log("child name: " + multi.Parent[i].name;
}

确定我得到的是单个结果还是多个结果的最佳方法是什么?我尝试了“typeof response”,希望为 multi 获得一个“Array”,但这不起作用。该对象最初是作为字符串接收的,但使用JSON.parse(responseString).

4

5 回答 5

3

您可能可以使用constructor属性。

>> single.Parent.constructor == Array
false
>> multi.Parent.constructor == Array
true
于 2012-10-18T08:54:05.683 回答
1

您可以测试要定义的“名称”属性。

var single = { "Parent" : { "name" : "foo" } };
var multi = { "Parent" : [ { "name" : "foo" }, { "name" : "bar" } ] };

console.log(single.Parent.name == undefined); // True
console.log(multi.Parent.name == undefined);  // False

参考:http : //jsfiddle.net/QhFvP/

于 2012-10-18T08:52:36.730 回答
0

typeof response会告诉你两者都是对象,因为 Array 是一个对象。

您可以尝试获取 multi.Parent.length 如果它是一个数组,它会给你一个数字,如果它是一个 JSON 对象,它会给你一个未定义的数字。所以,

for (var i = 0; i < multi.Parent.length; i++){
    console.log("child name", multi.Parent[i].name)
}
于 2012-10-18T08:55:23.360 回答
0

我看到你在这里做的一个错误。首先,这两个响应都是对象。根据结果​​的数量,它Parent是对象或列表的字段。你不应该这样做:

single[i].name

你应该写:

single.Parent[i].name

因此,要检查您是否有单个或多个响应,您必须检查

if(response.Parent instanceof Array){}

注意使用 ofinstanceof而不是typeof. 顺便说一句,使用 JSON 从文本构造对象没有问题。

于 2012-10-18T08:56:58.663 回答
0

最终代码:

// Using instanceof
if (response.Parent instanceof Array !== true) response.Parent = [response.Parent]
// More robust method, using .constructor:
if (response.Parent.constructor !== Array) response.Parent = [response.Parent]

// Continue with multi processing 
for (var i in response.Parent) {}

感谢所有的反馈。

于 2012-10-19T11:36:46.220 回答