小白鸡报道,最近跟同事讨论功能时,突然提到这个问题。然后大致实现了下。
话不多说,直接上代码
let a = {
b: {
c: {
d: {
e: {
f: {
k: {
s: 6
}
}
}
},
h: {
l: 5
},
m: 3
},
n: {
o: 3
},
p: 2
},
q: 1,
x: {
o: 3
},
}
/**
* 改变对象最深层数据值
*/
let max_index = 1;
function set(obj, max, objx, keyx) {
if (Object.prototype.toString.call(obj) !== '[object Object]') {
// 取出最大层不为标记值的数据
if (max_index <= max && keyx !== "$_key") {
// 取出最大层数
max_index = max;
}
} else {
// 当前层数加1
max++;
// 定义属性标记当前层数
obj.$_key = max;
for (const key in obj) {
// 递归
set(obj[key], max, obj, key);
}
}
}
function setVal(obj, val, pre_obj, pre_key) {
// 改变最深层键值不是标记值的数据值
if (pre_obj && pre_obj["$_key"] == max_index && pre_key != "$_key") {
pre_obj[pre_key] = val;
}
else {
for (const key in obj) {
setVal(obj[key], val, obj, key);
}
}
}
新手上路,希望大家多指教