我需要将'keys'作为一个字符串,然后将它们的值作为另一个字符串。
这是我写这个循环的失败尝试,它只能在一个层面上运行...
function convertToString(objArray) {
var str = '';
for (var i = 0; i < objArray.length; i++) {
var line = '';
for (var index in objArray[i]) {
if (line != '') line += ','
line += objArray[i][index];
}
str += line + '\r\n';
}
return str;
}
这是一个示例对象,真实的对象要大得多,但这应该用于示例目的:
var obj = {
"a": "a",
"b": [{
"c": "c",
"d": "d"
}, {
"e": "e",
"f": "f"
}],
"g": true,
"h": {
"i": "i",
"j": "j",
"k": 1
},
"l": "l"
};
键 的所需输出为:
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"
他们各自的值 string 将如下所示:
"a", object, "c", "d", "e", "f", true, object, "i", "j", 1, "l"
如果有人能引导我朝着正确的方向前进,那就太棒了,我不指望有人为我编写代码,但启动我的事情会很棒。
这背后的目的是,我可以将我的响应对象转换为我可以用来下载相同数据的CSV文件的格式。
答案 0 :(得分:4)
您可以在javascript中使用递归for..in,如下所示:
http://jsbin.com/udEBAxe/2/edit
var obj = {
"a": "a",
"b": [{
"c": "c",
"d": "d"
}, {
"e": "e",
"f": "f"
}],
"g": true,
"h": {
"i": "i",
"j": "j",
"k": 1
},
"l": "l"
};
function inspect(o, props){
var kk = [];
for(var p in o) {
if(o.hasOwnProperty(p)) {
if(typeof o[p] == 'object')
kk = kk.concat(inspect(o[p], props));
else {
var m = (props) ? o[p] : p;
kk.push(m);
}
}
}
return kk;
}
var s = inspect(obj,false);
alert(s.join(','));
s = inspect(obj,true);
alert(s.join(','));
答案 1 :(得分:2)
尝试
var obj = {
"a": "a",
"b": [{
"c": "c",
"d": "d"
}, {
"e": "e",
"f": "f"
}],
"g": true,
"h": {
"i": "i",
"j": "j",
"k": 1
},
"l": "l"
};
function x(obj, keys, vals) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var val = obj[key];
keys.push(key);
vals.push(val);
if (typeof val == 'object') {
//borrowed from angularjs isArray
//http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js
if (toString.apply(val) == '[object Array]') {
for (var i = 0; i < val.length; i++) {
x(val[i], keys, vals)
}
} else {
x(val, keys, vals)
}
}
}
}
}
var keys = [],
vals = [];
x(obj, keys, vals);
console.log(keys)
console.log(vals)
演示:Fiddle
答案 2 :(得分:0)
好的,您的输出会显示值,而不是对象的键。
您只需使用underscore.js库获取所有密钥即可。这只是顶级的示例:
_.keys(obj);
// output : [ "a","b","g","h","l" ];