很抱歉标题很差,但我甚至不能正确地命名问题,因此无法找到解决方案,我只能描述我正在努力实现的目标。
我有一份发动机类型的清单&它们的燃料。
export const engineTypes = {
0: 'HYBRID',
1: 'GASOLINE',
2: 'GAS',
4: 'DIESEL',
8: 'ELECTRIC',
}
export const fuelTypes = {
DIESEL: 'Diesel',
GASOLINE: 'Gasoline',
GAS: 'Gas',
HYBRID: 'Hybrid',
ELECTRIC: 'Electric',
}
export const getFuelTypeByEngineType = (type) => {
const engine = engineTypes[type]
if (engine) {
return fuelTypes[engine]
}
}这个想法是传递一个像getFuelTypeByEngineType(2)这样的值来得到'GAS‘的返回,但是,如果我做一些像getFuelTypeByEngineType(9)这样的事情,我应该得到’汽油‘,’电动‘回来。
意思是9是-> 8(电动)+1(汽油)
如何做到这一点?请帮帮我!
发布于 2020-05-05 12:06:11
如果您在decomposing an arbitrary number into bits上引用链接问题中的一个答案,那么您所需要做的就是使用Array.prototype.map返回一个引擎类型数组,其键位于返回的位数组中。
有些人抓到了:
0键,因为在最后的分解步骤中,您将始终以0的余数结束。如果坚持这样做,那么您将需要在方法中保护子句,如果值为0["HYBRID"] --在engineTypes中不存在键的事件中,将得到undefined。可以很容易地通过过滤映射的数组来绕过它。见下文的概念证明:
const engineTypes = {
0: 'HYBRID',
1: 'GASOLINE',
2: 'GAS',
4: 'DIESEL',
8: 'ELECTRIC',
}
const fuelTypes = {
DIESEL: 'Diesel',
GASOLINE: 'Gasoline',
GAS: 'Gas',
HYBRID: 'Hybrid',
ELECTRIC: 'Electric',
}
const getFuelTypeByEngineType = (type) => {
if (type === 0) {
return [engineTypes[type]];
}
return getBits(type)
.map(t => {
return engineTypes[t];
})
.filter(v => !!v);
}
const getBits = (value) => {
let b = 1;
const res = [];
while (b <= value){
if (b & value) res.push(b);
b <<= 1;
}
return res;
}
console.log(getFuelTypeByEngineType(0)); // ["HYBRID"]
console.log(getFuelTypeByEngineType(9)); // ["GASOLINE", "ELECTRIC"]
console.log(getFuelTypeByEngineType(64)); // []
https://stackoverflow.com/questions/61612514
复制相似问题