0
点赞
收藏
分享

微信扫一扫

JSON数据扁平化 javascript实现

水沐由之 2022-04-13 阅读 78

面试题:将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
}
举报

相关推荐

0 条评论