[英]Flattening a Javascript dictionary, preserving the nested keys
我在 SO 上有用于展平数组 javascript 的方法,即将[1,[2,3]]
转换为[1,2,3]
。 但是我正在寻找一种在保留键的同时展平字典的简洁方法。 具体来说,我想要一个看起来像这样的字典:
{'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}}
要转换为:
{'key1':1, 'key2.key3':2,'key2.key4':3,'key2.key5.key6':4}
确切的输出格式(字典、对列表等)并不重要,只要它清楚地将嵌套键的字符串与值相关联即可。 出于我的目的,假设所有键都不包含.
字符,以便它可以用来表示下一个键。
var keys = {'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}}, result = {};
function serialize(keys, parentKey){
for(var key in keys){
if(parseInt(keys[key], 10)){
result[parentKey+key] = keys[key];
}else{
serialize(keys[key], parentKey+key+".");
}
}
}
serialize(keys, "");
console.log(result);
希望这是你想要的。
这是解决问题的另一种方法。
var myDict = {'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}};
function flattenDict(dictToFlatten) {
function flatten(dict, parent) {
var keys = [];
var values = [];
for(var key in dict) {
if(typeof dict[key] === 'object') {
var result = flatten(dict[key], parent ? parent + '_' + key : key);
keys = keys.concat(result.keys);
values = values.concat(result.values);
}
else {
keys.push(parent ? parent + '_' + key : key);
values.push(dict[key]);
}
}
return {
keys : keys,
values : values
}
}
var result = flatten(dictToFlatten);
var flatDict = {};
for(var i = 0, end = result.keys.length; i < end; i++) {
flatDict[result.keys[i]] = result.values[i];
}
return flatDict;
}
flattenDict(myDict);
此代码不使用全局变量来存储结果。
var dict = {'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}}; function flatten(obj, suffix, ans) { for (var x in obj) { var key; if (suffix != '') key = suffix + '.' + x; else key = x; if (typeof obj[x] === 'object') { flatten(obj[x], key, ans); } else { ans[key] = obj[x]; } } } var x = {}; flatten(dict, "", x) console.log(x)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.