想了一个面试题

想出一个原创一点,不会太难,也不会太简单,考察候选人的平时练习和思维。有一个对象如下:

let obj = {
    a:1,
    b:{
        c: 2
    }
}

需要转换成:

<root>
    <a>1</a>
    <b>
        <c>2</c>
    </b>
</root>

该怎么实现呢?


function pad(count) {
    return '\n' + ''.padStart(count * 2)
}

function transfer(obj, tab = 0) {
    if(typeof obj !== 'object') return pad(tab) + obj
        
    let str = ''

    for(let k in obj) {
        let v = obj[k]
        str += pad(tab) + '<' + k + '>'
        str += transfer(v, tab + 1)
        str += pad(tab) + '</' + k + '>'
    }

    return str
}

console.log('results: ')
console.log(transfer(obj))

如果我们思路换一下呢?通过一个简单的 xml 转成对象。

let xml = `<root>
    <a>1</a>
    <b>
    <b1>b1</b1>
        <c>2</c>
    </b>
</root>`

fn(xml)

function fn(xml) {
    let root = Object.create(null)
    let stack = [root]
    let value = ''

    for (let index = 0; index < xml.length; index++) {
        let c = xml[index]
        if (!c.trim())
            continue

        // console.log(index)

        if (c === '<') {
            let[i,attr] = findNextBigSymbol(index, xml)
            index = i
            // console.log(i, attr)

            if (attr.startsWith('/')) {
                let p = stack.pop()
                p = stack.pop()
                if (value) {
                    p[attr.substr(1)] = value
                }
                stack.push(p)
                value = ''
                continue
            }

            let p = stack.pop()
            p[attr] = Object.create(null)
            stack.push(p, p[attr])

            continue
        }
        value += c
    }

    return root.root
}

function findNextBigSymbol(startIndex, xml) {
    let i = xml.indexOf('>', startIndex)

    return [i, xml.substr(startIndex + 1, i - startIndex - 1)]
}

作者: 曾小乱

喜欢写点有意思的东西

《想了一个面试题》有一个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注