如何创建JS递归函数来格式化数据对象,但设置一个级别来转换对象或保留原始数据



const obj2arr = (data, level) => {
const dataKeys = "object" === typeof(data) && !Array.isArray(data) && Object.keys(data);
let results = [];
if (!!dataKeys) {
for (let dataKey of dataKeys) {
let obj = {
name: dataKey
}
obj["values"] = data[dataKey] || null;
if ("object" === typeof(data[dataKey]) && !Array.isArray(data[dataKey]) &&
data[dataKey] && "object" === typeof(data[dataKey]) && level > 0) {
obj["values"] = obj2arr(data[dataKey], level);
--level
}
++level
results = [...results, obj];
}
}
return results
}
let b = {
a: [1, 2],
b: 3,
c: 'c',
d: {
d1: 'bla',
d2: 'ble',
d3: {
e: 1,
f: [1, 2],
g: 'bli',
h: {
h1: 1,
h2: 2
}
}
}
};
res = obj2arr(b, 1);
console.log(res);

您不应该有那些level++level--指令。相反,将level - 1传递给递归调用:

obj["values"] = obj2arr(data[dataKey], level - 1);

这样,您已经具备的条件(level > 0(将确保仅在给定级别上进行转换。

我没有碰你代码中的任何其他内容:

const obj2arr = (data, level) => {
const dataKeys = "object" === typeof(data) && !Array.isArray(data) && Object.keys(data);
let results = [];
if (!!dataKeys) {
for (let dataKey of dataKeys) {
let obj = {
name: dataKey
}
obj["values"] = data[dataKey] || null;
if ("object" === typeof(data[dataKey]) && !Array.isArray(data[dataKey]) &&
data[dataKey] && "object" === typeof(data[dataKey]) && level > 0) {
obj["values"] = obj2arr(data[dataKey], level - 1);
}
results = [...results, obj];
}
}
return results
}
let b = {
a: [1, 2],
b: 3,
c: 'c',
d: {
d1: 'bla',
d2: 'ble',
d3: {
e: 1,
f: [1, 2],
g: 'bli',
h: {
h1: 1,
h2: 2
}
}
}
};
res = obj2arr(b, 1);
console.log(res);

最新更新