一种替代的递归实现。尽管现有的实现已经非常好了,但我仍然想写一个自己的实现。
递归函数检查键是否为'object'
类型。
- 如果是对象,我们对每个对象的键进行迭代。
- 否则,将其添加到我们的结果对象中。
function flat(res, key, val, pre = '') {
const prefix = [pre, key].filter(v => v).join('.');
return typeof val === 'object'
? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res)
: Object.assign(res, { [prefix]: val});
}
return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {});
扁平化 NPM 包
你也可以简单地使用扁平化 NPM 包,这是一个广为人知、经过测试的库。
var flatten = require('flat')
flatten(obj);
⬑ 我会在重要的代码中使用这个。
[额外] 更简洁的调用上面的函数
function flatObject(input) {
function flat(res, key, val, pre = '') {
const prefix = [pre, key].filter(v => v).join('.');
return typeof val === 'object'
? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res)
: Object.assign(res, { [prefix]: val});
}
return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {});
}
const result = flatObject(input);
[额外] 演示
http://codepen.io/zurfyx/pen/VpErja?editors=1010
function flatObject(input) {
function flat(res, key, val, pre = '') {
const prefix = [pre, key].filter(v => v).join('.');
return typeof val === 'object'
? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res)
: Object.assign(res, { [prefix]: val});
}
return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {});
}
const result = flatObject({
a: 'jack',
b: {
c: 'sparrow',
d: {
e: 'hahaha'
}
}
});
document.getElementById('code').innerHTML = JSON.stringify(result, null, 2);
<pre><code id="code"></code></pre>