今天去一家公司面试前端的笔试题有几道不是太会?求解答

对于数组[1,2, 3, 5, 6, 8, 10.11,12],数字连续用- 表示,转成[1-3,5-6,8,10-12] ?

js把以下数据转成树形结构?
var obj=[
(id3, parent:2).
(id:1, parent:null).
{id:2, parent:1}.
]

怎么把<div> <p> {$no}</p> <p> {title}</p> </div>中的$no改成5 ,$title 改成jack ?

阅读 2.7k
3 个回答

1.遍历数组进行分组,如果当前元素与前面不连续则新分一组,最后把每组元素用-连接起来。

2.转树结构写过一篇文章,你可以在这里找到答案:http://wintc.top/article/20

3. 正则或者简单的replace.


都不复杂就留给你自己思考代码实现了~

下面是用reducer处理。你也可以不用它,设定一个辅助游标,找到连续的起点索引,用循环+ slice 达到同样的目的。

function reducer (acc, v, i,arr) {
    // 1.过滤所有连续数(用或运算考虑临界情况)
    if ((arr[i + 1] - arr[i] == 1) || (arr[i] - arr[i - 1] == 1) ) {
        // 2.创建二维数组元素
        if (arr[i] - arr[i - 1] != 1) {
            acc.push([])
        }
        acc[acc.length - 1].push(v)
    } else {
        // 3.加入不连续数
        acc.push(v)
    }
    return acc
}

测试如下

var aList = [1,2, 3, 5, 6, 8, 10,11,12]
var str = aList.reduce(reducer,[]).map(v => Array.isArray(v) ? v.join('-') : v)
console.log(aList)
consolog.log(str)

输出

[ 1, 2, 3, 5, 6, 8, 10, 11, 12 ]
[ '1-2-3', '5-6', 8, '10-11-12' ]

第三题解

str = "<div> <p> {$no}</p> <p> {$title}</p> </div>"

// 1. 创建正则实例
var re = /(?<=\{)(\$\w+)(?=\})/g
// 2. 构建替换对象
var o = {'no':5, 'title':'jack'}
// 3. 替换
var res = str.replace(re, m => o[m.substr(1)])

console.log(str)
console.log(res)

输出

<div> <p> {$no}</p> <p> {$title}</p> </div>
<div> <p> {5}</p> <p> {jack}</p> </div>

第一道题的解法,

function arr2Bar (arr) {
    let result = [], i = 0

    result[i] = [arr[0]]  // 二维数组初值resutl[0][0] = [arr[0]]

    arr.reduce((prev, cur) => {
        // 如果连续,把元素放在二维数组里面;不连续,二维数组长度递增一个,把新的数组放在新的递增数组内
        cur - prev === 1 ? result[i].push(cur) : result[++i] = [cur]

        return cur
    })

    return result.map(item => { 
        // 二维数组转成一维数组
        if (item.length > 1) { return item[0] + '-' + item[item.length -1] }

        return item[0]
     })
} 

const res = arr2Bar([1, 2, 3, 5, 6, 8, 10, 11, 12])
console.log(res)

第二道题数据不齐,没做,不过你看第一位大佬的文章,看懂的话,应该不难
第三道题

const str = '<div><p>{$no}</p><p>{title}</p></div>'

const reg = /\{([^}]+)\}/g  // 取消正则的懒惰性在正则最后加上g,这是正则会自动保存一个lastIndex,下次从此处开始

const data = { 
    no: 5, 
    title: 'jack'
 }

const newStr = str.replace(reg, ($1,res) => {
    
    if (res.indexOf('$') > -1) { res = res.trim().substring(1) }    // 去掉$
    
    for(const d in data) {
        if (res == d) return data[d]  // 如果data里面有值就把值给新的字符串
    } 
 })

console.log(newStr)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏