题目描述
实现一个方法,将对象按如下要求扁平化,对象用
.连接,数组通过[key]连接,最后结果如下:
const obj = {
a: {
b: 1,
c: 2,
d: { e: 5 }
},
b: [1, 3, { a: 2, b: 3 }],
c: 3
};
console.log(flatten(obj));
// {
// 'a.b': 1,
// 'a.c': 2,
// 'a.d.e': 5,
// 'b[0]': 1,
// 'b[1]': 3,
// 'b[2].a': 2,
// 'b[2].b': 3
// c: 3
// }
代码实现
function flatten (obj) {
if (!isObject(obj)) {
return;
}
const result = {};
const dfs = (current, prefix) => {
// 对象
if (isObject(current)) {
// 数组类型
if (Array.isArray(current)) {
current.forEach((item, index) => {
// 数组前缀
dfs(item, `${prefix}[${index}]`);
});
} else {
// 普通对象
for (const key in current) {
// 普通对象前缀
dfs(current[key], `${prefix}${prefix ? '.' : ''}${key}`);
}
}
} else {
result[prefix] = current;
}
};
dfs(obj, '');
return result;
}
function isObject (val) {
return typeof val === 'object' && val !== null;
}