面试题:将JSON数据扁平化
//原数据
let obj = {
a: 1,
b: {c: 2,d: 3},
e: [1, 2, 3],
name:"张三",
f: [{g: 1}, {h: 2}],
q:[{a:1,b:[2,3]}],
p:null,
r:[2,[3,4]]
}
//目标格式
{
a: 1,
'b.c': 2,
'b.d': 3,
'e[0]': 1,
'e[1]': 2,
'e[2]': 3,
name: '张三',
'f[0].g': 1,
'f[1].h': 2,
'q[0].a': 1,
'q[0].b[0]': 2,
'q[0].b[1]': 3,
'r[0]': 2,
'r[1][0]': 3,
'r[1][1]': 4
}
实现一:
function typeJudge(item) {
if(Object.prototype.toString.call(item) === '[object Array]'){
return 'Array';
}
else if(Object.prototype.toString.call(item) === '[object Object]'){
return 'Object';
}
else {
return 'Basic';
}
}
function objectFlat(obj = {}) {
let res = {};
function flat(item, preKey = '') {
if(typeJudge(item) == 'Object'){
for(let key in item){
if(typeJudge(item[key]) != 'Basic'){
flat(item[key],preKey==''? `${key}`:`${preKey}.${key}`)
}
else {
if(preKey == ''){
res[`${key}`] = item[key];
}else {
res[`${preKey}.${key}`] = item[key];
}
}
}
}
else if(typeJudge(item) == 'Array'){
for(let key in item){
if(typeJudge(item[key]) != 'Basic'){
flat(item[key],preKey==''? `${key}`:`${preKey}[${key}]`)
}
else {
if(preKey == ''){
res[`${key}`] = item[key];
}else {
res[`${preKey}[${key}]`] = item[key];
}
}
}
}
}
flat(obj)
return res;
}
实现二:在实现一的基础上合并了一些判断
function typeJudge(item) {
if(Object.prototype.toString.call(item) === '[object Array]'){
return 'Array';
}
else if(Object.prototype.toString.call(item) === '[object Object]'){
return 'Object';
}
else {
return 'Basic';
}
}
function objectFlat1(obj = {}) {
let res = {};
function flat(item, preKey = '') {
for(let key in item){
if(typeJudge(item[key]) != 'Basic'){
if(typeJudge(item) == 'Object'){
flat(item[key],preKey==''? `${key}`:`${preKey}.${key}`)
}else {
flat(item[key],preKey==''? `${key}`:`${preKey}[${key}]`)
}
}
else {
if(preKey == ''){
res[`${key}`] = item[key];
}else {
if(typeJudge(item) == 'Object'){
res[`${preKey}.${key}`] = item[key];
}else {
res[`${preKey}[${key}]`] = item[key];
}
}
}
}
}
flat(obj)
return res;
}
同门写的实现,typeof null 也等于obeject,所有逻辑可能有点小问题,此版本去除了null与undefined;
function flatten(input) {
let result = {}
if(input instanceof Array){
let tmp = {}
input.forEach((value, index)=>{
let attr = '[' + index + ']'
tmp[attr] = input[index]
result = flatten(tmp)
})
}else{
Object.keys(input).forEach(key => {
if(typeof input[key] === "object"){
if(input[key] instanceof Array){
let tmp = {}
input[key].forEach((value, index)=>{
let attr = key + '[' + index + ']'
tmp[attr] = input[key][index]
})
result = Object.assign({}, result, flatten(tmp))
}else if(Object.prototype.toString.call(input[key]) === '[object Object]'){
let tmp = {}
Object.keys(input[key]).forEach(k => {
let attr = key + '.' + k
tmp[attr] = input[key][k]
})
result = Object.assign({}, result, flatten(tmp))
}
}else {
if(input[key] !== undefined && input[key] !== null){
result[key] = input[key];
}
}
})
}
return result
}