今年赶上了疫情,各大企业为了生存,不得不缩减人员,然而我也不得不出来面试了,碰到了一道看似简单却又不简单的面试题目,与大家分享一下,希望大家发表一下自己的看法。
// 实现一个函数,接受类似输入数组, 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
}
在疫情期间,一位面试者遇到了一个看似简单的编程题,要求将商品的多个属性进行组合,生成所有可能的商品配置。题目使用JavaScript实现,通过递归或嵌套循环方式,将商品的不同属性类型进行配对。

3648

被折叠的 条评论
为什么被折叠?



