我有一个对象,它的键我不知道,但结构基本上是一样的。值可以是字符串,也可以是字符串/对象的另一个对象。下面是一个示例:
d = {
"name": "Sam",
"grade": 9,
"classes": {
"a": 1,
"b": 2
},
"age": null
}
我现在想要的是,如果value不是另一个对象,那么获取键名和它的值。如果value为null,则返回空字符串。根据以上内容,预期输出为:
name=Sam, grade=9, a=1, b=2, age=''
在这里,因为classes是object,所以必须再次循环以获得键(a,b)和值(1,2)。
我尝试了以下方法,但如果其中任何一个值为null,它都会返回错误:
Cannot convert undefined or null to object
如果没有空值,它会工作得很好:
function getKeyValues(data) {
var q = '';
f(data);
function f(s) {
Object.keys(s).forEach(function(key) {
if (typeof s[key] === 'object') {
f(s[key]);
} else {
q = q + key + '=' + (s[key] == null) ? "" : s[key] + '&';
}
});
}
return q;
}
d = {
"name": "Sam",
"grade": 9,
"classes": {
"a": 1,
"b": 2
},
"age": null
}
console.log(getKeyValues(d));
发布于 2018-07-17 03:02:57
试试这个:
function getKeyValues(data) {
var q = [];
var keys = Object.keys(data);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var value = data[key];
if (value == null) {
q.push(key + "=''");
} else if (typeof value == "object") {
q.push(getKeyValues(value));
} else {
q.push(key + "=" + value);
}
}
return q.join(",");
}
发布于 2018-07-17 03:17:32
另一种方法是使用reduce
方法。就我个人而言,我觉得它更干净一点。
function getKeyValues(d) {
return Object.keys(d).reduce((memo, key) => {
if (!d[key]) {
memo[key] = '';
} else if (typeof d[key] === 'object') {
Object.keys(d[key]).forEach((subKey) => {
memo[subKey] = d[key][subKey];
})
} else {
memo[key] = d[key];
}
return memo;
}, {})
}
另外,虽然你的问题很清楚,但我必须说,这也让我有点警惕。如果属性名称在嵌套对象中重复,您可能会发现自己处于一些困难的调试环境中。例如,如果
d={"name":"Sam","grade":9,"buddy":{"name":"Jeff","age":12}}
你希望名字是"Sam“还是"Jeff"?回答你的问题的函数也可以返回,所以这是需要注意的事情。
https://stackoverflow.com/questions/51368281
复制相似问题