实现destructuringArray方法,达到如下效果

Posted vcxiaohan2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现destructuringArray方法,达到如下效果相关的知识,希望对你有一定的参考价值。

网上的阿里二面的一道笔试题,实现destructuringArray函数,具有如下功能:

// destructuringArray( [1,[2,4],3], "[a,[b],c]" )
// result
//  a:1, b:2, c:3 

网上解法不一且没有注释,为新人易懂,在此提供个人认为思路比较巧妙的2种解法,详见注释:

let a = f([1, [2, [4]], 3], '[a,[b,[d,e]],c]')
let b = f2([1, [2, [4]], 3], '[a,[b,[d,e]],c]')
console.log(a)// a: 1, b: 2, d: 4, e: undefined, c: 3
console.log(b)// a: 1, b: 2, d: 4, e: undefined, c: 3

// eval实现(关键词:解构、扁平化)
function f(arr, str) 
  let html = `
    // 构建自执行函数,因为return语句必须放在函数中
    ;(() => 
      // 这里构建数组解构,形如:let ['a', 'b'] = [1, 2]
      let $str = arr
      // 这里相当于扁平化了数组,形如:多维数组['a', ['b']]扁平为一维数组['a', 'b']
      let res = str.match(/[a-z]+/g)
      let obj = 
      res.forEach((val, index) => 
        // 使用eval获取上面解构过的变量值
        obj[val] = eval(val)
      )
      return obj
    )()
  `
  return eval(html)


// 递归实现(关键词:深拷贝)
function f2(arr, str) 
  // 初次执行传入的是字符串,我们转为数组,而之后递归,传入的则都是数组
  str = Array.isArray(str) ? str : JSON.parse(str.replace(/([a-z]+)/g, '"$1"'))
  let obj = 
  str.forEach((val, index) => 
    // 缓存该键对应的值
    let res = arr[index]
    if (Array.isArray(val)) // 值为数组时,需要递归
      // 将递归的值拷贝至最初的对象,思路类似深拷贝
      Object.assign(obj, f2(res, val))
     else // 值为数值时,直接赋值
      obj[val] = res
    
  )
  return obj

以上是关于实现destructuringArray方法,达到如下效果的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中为什么要使用接口,继承接口不是还要重写方法吗?为什么不直接写那些方法呢?:::接口的最主要的作用是达到统一访问

freenas 实现内网smb共享,传输速度达到2G

怎么让centos上的mysql服务器的cpu快速达到 95%以上, 实现模拟环境?

C#超简单方法实现两个richtextbox控件滚动条同步滚动

201671010145 2016-2017 《Java程序设计》java的继承中什么叫方法覆盖,是如何实现的?

用R语言实现遗传算法