首页 > 解决方案 > 获取正确的数字

问题描述

抱歉标题不好,但我什至无法正确命名问题,因此无法搜索解决方案,我只能描述我想要实现的目标。

我有一份发动机类型及其燃料的清单。

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)我应该得到 ['GASOLINE', 'ELECTRIC'] 回来。

含义 9 是 -> 8(电动)+ 1(汽油)

如何做到这一点?请帮忙!

标签: javascript

解决方案


如果您借用链接问题中关于将任意数字分解为位的答案之一,那么您需要做的就是使用Array.prototype.map返回一个引擎类型数组,其键存在于返回的位数组中。

一些问题:

  • 您应该使用 的键0,因为在最后的分解步骤中,您总是会得到余数 0。如果您坚持这样做,那么您将需要在您的方法中使用保护子句,["HYBRID"]如果值为0
  • 如果密钥中不存在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)); // []


推荐阅读