给定一个“Flatten” Dictionary 对象其键是点分割的,例如:{"A":1,"B.A":2,"B.B":3,"CC.D.E":4,"CC.D.F":5},实现一个函数,将其转换 为一个嵌套的字典对象,根据上面例子,嵌套对象结果为{A:1,"B":{"A":2,"B":3},"CC":{"D":{"E":4,"F":5}}}
/**
* {A:1, B.A:2 B.B:3 CC.D.E:4 CC.DF:5}
* @param args
*/
public static void main(String[] args) {
Map<String, Integer> flatten = new HashMap<>();
//生成例子数据
flatten.put("A",1);
flatten.put("B.A",2);
flatten.put("B.B",3);
flatten.put("CC.D.E",4);
flatten.put("CC.D.F",5);
Map<String, Object> newFlatten = new HashMap<>();
flatten.forEach((key,val)->{
recursion(key,newFlatten, val);
});
System.out.println(flatten);
System.out.println(newFlatten);
}
/**
* 递归方法
* @param key
* @param map
* @param val
*/
public static void recursion(String key ,Map<String,Object> map,Integer val){
boolean contains = key.contains(".");
//最后一个赋值
if(!contains){
map.put(key,val);
}else{
String beforeKey = StrUtil.subBefore(key, ".", false);
String afterKey = StrUtil.subAfter(key, ".", false);
HashMap<String, Object> newMap = new HashMap<>();
if (!map.containsKey(beforeKey)){
map.put(beforeKey,newMap);
}else {
newMap = (HashMap<String, Object>) map.get(beforeKey);
}
recursion(afterKey,newMap,val);
}
}
(function(a){
var r={};
for(var k in a){
var i=k.split('.');
for(var m=0;m<i.length;m++){
var e='';
if(m==i.length-1){
e='r'+k.replace(/([^\.]+)/gi,'[\'$1\']').replace(/\./gi,'')+'=a[k]';
}else{
var x='r'+(k.match(new RegExp('((\\.|^)[^\\.]+){'+(m+1)+'}','gi'))[0]).replace(/([^\.]+)/gi,'[\'$1\']').replace(/\./gi,'');
e=x+'='+x+'||{}';
}
console.log(e);
eval(e);
}
}
console.log(r)
})({"A":1,"B.A":2,"B.B":3,"CC.D.E":4,"CC.D.F":5})
笨办法
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
function fn(o){
let keys = Reflect.ownKeys(o)
let t = {}
keys.forEach(str => {
// 获取值
let v = o[str]
// 创建一个新的临时对象用来保存值
// 从最内部的键名开始
let _t = {}
str.split(".").reverse().forEach((key, index) => {
let obj = {}
index === 0 ? obj[key] = v : obj[key] = _t
_t = obj
})
// 比较对象赋值
let outT= t;
let b = true;
while(b){
if(Object.prototype.toString(_t).slice(8,-1) !== "Object"){
console.error('_t 不是一个对象: ',_t)
break;
}
// 获取临时对象的键名
key = Reflect.ownKeys(_t)
// 因为参数对象不会有重复的属性
// 所以只需要检查属性的值 === undefined
if(outT[key] === undefined){
outT[key] = _t[key]
b = false;
}else{
outT = outT[key];
_t = _t[key]
}
}
})
return t;
}
let t = fn({"A":1,"B.A":2,"B.B":3,"CC.D.E":4,"CC.D.F":5})