我正在构建与远程服务集成的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)
转换为对象。
答案 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
答案 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) {}
感谢所有反馈。