Comments (2)
// 辅助函数
const isObj = obj => Object.prototype.toString.call(obj) === '[object Object]'
// 扁平化树形结构
function flattenNTreeHelper (data, ans, prevKey = '') {
Object.keys(data).forEach(key => {
const currKey = prevKey ? prevKey + '.' + key : key
const currVal = data[key]
if (isObj(currVal)) {
flattenNTreeHelper(currVal, ans, currKey)
} else {
ans[currKey] = currVal
}
})
}
function flattenNTree (data) {
if (!isObj(data)) return data
const ans = {}
flattenNTreeHelper(data, ans, '')
return ans
}
// 扁平化结构转树形
function nTreeConstruct (data) {
if (!isObj(data)) return data
const ans = {}
Object.keys(data).forEach(key => {
// 按 . 分割key, 顺带支持一下形如 'z[0]'的格式
const keys = key.replace(/\[(\d+)\]/g, '.$1').split('.')
let curr = ans
for (let i = 0; i < keys.length - 1; i++) {
curr[keys[i]] = curr[keys[i]] || {}
curr = curr[keys[i]]
}
curr[keys[keys.length - 1]] = data[key]
})
return ans
}
from fe-learning.
再考虑以下数据:
const data = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
e: 'ae',
g: [1, { g1: 6 }, [1, 2]]
}
}
// 期望输出
const output = {
'a.b.c.dd': 'abcdd',
'a.e': 'ae',
'g[0]': 1,
'g[1].g1': 6,
'g[2][0]': 1,
'g[2][1]': 2
}
也就是生成key的时候要多考虑一个数组类型,实现如下:
function flattenNTreeHelper (data, ans, prevKey = '', isArr = false) {
Object.keys(data).forEach(key => {
const currKey = prevKey ? (prevKey + (isArr ? ('[' + key + ']') : ('.' + key))) : key
const currVal = data[key]
const dataIsArr = Array.isArray(currVal)
if (isObj(currVal) || dataIsArr) {
flattenNTreeHelper(currVal, ans, currKey, dataIsArr)
} else {
ans[currKey] = currVal
}
})
}
from fe-learning.
Related Issues (20)
- 剑指offer —— 重建二叉树 HOT 1
- 关于async和await的“同步” HOT 1
- 实现一个深克隆函数
- 将JS对象表示的DOM结构渲染为真实DOM树
- 将list数据转换成树形结构
- 手写eventbus
- 实现Lodash函数系列(一):_.get HOT 2
- 京东面经 HOT 1
- 实现Promise.all及finally
- CSS绘制常见的图形
- CSS实现一个响应式布局
- 二叉树的路径
- 判断二叉树是否相同/对称/子树
- 字符串相加和相乘
- 将数字转换为人民币单位格式 HOT 1
- 微信面试题 LazyMan
- flex相关属性的计算方法
- 实现一个repeat函数 HOT 4
- 记一次字节前端笔试
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fe-learning.