一道值得思考的前端面试的思考题

在疫情期间,一位面试者遇到了一个看似简单的编程题,要求将商品的多个属性进行组合,生成所有可能的商品配置。题目使用JavaScript实现,通过递归或嵌套循环方式,将商品的不同属性类型进行配对。

今年赶上了疫情,各大企业为了生存,不得不缩减人员,然而我也不得不出来面试了,碰到了一道看似简单却又不简单的面试题目,与大家分享一下,希望大家发表一下自己的看法。

      // 实现一个函数,接受类似输入数组, type 是一个数组
      let goods = [
        {id:1, caption: '价格', type: ['10', '20']},
        {id:2, caption: '材质', type: ['塑料']},
        {id:3, caption: '颜色', type: ['白', '蓝', '红']}
      ]
      // 结果如下
      [
        {"1":"10","2":"塑料","3":"白"},
        {"1":"10","2":"塑料","3":"蓝"},
        {"1":"10","2":"塑料","3":"红"},
        {"1":"20","2":"塑料","3":"白"},
        {"1":"20","2":"塑料","3":"蓝"},
        {"1":"20","2":"塑料","3":"红"}
      ]
      function generateItems(goods) {
        const retVal = []
        // code
        return retVal
      }
      console.log(JSON.stringify(generateItems(arr)))

刚开始初看题目,觉得不过尔尔,准备上手突然傻眼了,思前想后不得其法,被绕进去了,于是放下了,后来晚上突然灵光一闪,有了思路,发出来与大家共勉。

实现方法1

function generateItems(goods) {
  return goods.reduce((acc, good) => {
    const key = good.id.toString()
    
    // 处理第一个属性
    if (acc.length === 0) {
      return good.type.map(type => ({ [key]: type }))
    }
    
    // 组合现有结果与新属性
    return acc.flatMap(item => 
      good.type.map(type => ({ ...item, [key]: type }))
    )
  }, [])
}

实现方法2

function generateItems(goods) {
  const retVal = []
  
  // 回溯算法
  function backtrack(index, current) {
    // 所有属性都处理完毕
    if (index === goods.length) {
      retVal.push({...current})
      return
    }
    
    const good = goods[index]
    const key = good.id.toString()
    
    // 尝试当前属性的每个可能值
    for (let i = 0; i < good.type.length; i++) {
      current[key] = good.type[i]
      // 递归处理下一个属性
      backtrack(index + 1, current)
      // 回溯,删除当前选择
      delete current[key]
    }
  }
  
  backtrack(0, {})
  return retVal
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值