javascript:以编程方式确定对象的结构

时间:2012-10-18 08:47:47

标签: javascript

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

下面显示了2种格式,第一种是父母有一个孩子,第二种是父母有> 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”,希望得到一个“数组”用于多,但是没有用。该对象最初是作为字符串接收的,但是使用JSON.parse(responseString)转换为对象。

5 个答案:

答案 0 :(得分:3)

您可以使用constructor属性。

>> single.Parent.constructor == Array
false
>> multi.Parent.constructor == Array
true

答案 1 :(得分:1)

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

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

Cf:http://jsfiddle.net/QhFvP/

答案 2 :(得分:0)

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

您可以尝试获取multi.Parent.length,如果它是一个数组,它将为您提供一个数字,如果它是一个JSON对象,则为undefined。所以,

for (var i = 0; i < multi.Parent.length; i++){
    console.log("child name", multi.Parent[i].name)
}

答案 3 :(得分:0)

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

single[i].name

你应该写下:

single.Parent[i].name

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

if(response.Parent instanceof Array){}

请注意使用instanceof代替typeof。而BTW使用JSON从文本构造对象没有问题。

答案 4 :(得分: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) {}

感谢所有反馈。