JavaScript-内联切换语句?

时间:2019-04-29 01:38:09

标签: javascript

如果我想检查相同的值是否等于多个不同的值,且每次都有不同的结果,例如(例如):

var someArray = new (
    max - min < 128 ? Int8Array : 
    max - min < 256 ? Uint8Array :
    max - min < 32768 ? Int16Array : 
    max - min < 65536 ? Uint16Array :
    max - min < 2147483648 ? Int32Array :
    max - min < 4294967296 ? Uint32Array :
    Array
)

我需要每次(最大-最小)重写值,即使它是单个变量,也仍然需要重复。有什么方法可以只写一次该值但得到相同的结果,例如:

var someArray = new (
        inlineSwitch(max - min) $$ //just an example symbol
        < 128 ? Int8Array : 
        < 256 ? Uint8Array :
        < 32768 ? Int16Array : 
        < 65536 ? Uint16Array :
        < 2147483648 ? Int32Array :
        < 4294967296 ? Uint32Array
)

还是什么?有什么办法可以做这样的事情吗?还是可以做成一个需要类似输入的函数?

编辑

我在最后添加了最后一个“数组”条件,如果该条件大于任何条件,则也应考虑到这一点。速度也是主要因素-如果这是功能的一部分,那么比添加许多其他变量可能会使速度变慢。

2 个答案:

答案 0 :(得分:2)

您可以改用一个对象,该对象按数字索引,其值是关联的构造函数,然后.find相应的条目:

const constructorByNumRange = {
  128 : Int8Array,
  256: Uint8Array,
  // ...
};

const diff = max - min;
const constructorEntry = Object.entries(constructorByNumRange)
  .find(([numStr]) => Number(numStr) < diff);
const someArray = new constructorEntry[1]();

如果有可能找不到条目,​​则可以添加一个检查,以确认.find返回条目:

if (!constructorEntry) {
  // handle situation in which the diff range was not found
  throw new Error('Not found');
}

您也可以使用数组数组代替对象:

const constructorByNumRange = [
  [128, Int8Array],
  [256, Uint8Array],
  // ...
};

const diff = max - min;
const constructorEntry = constructorByNumRange
  .find(([num]) => num < diff);

答案 1 :(得分:0)

我正在使用对象数组保留可比较的项目,然后使用Array.filter进行过滤,Object.keys-比较差异,然后使用Object.values发送给函数以获取结果

const numberTypesList = [
  { 128: Int8Array },
  {
    256: Uint8Array
  },
  { 32768: Int16Array },
  { 65536: Uint16Array },
  { 2147483648: Int32Array },
  { 4294967296: Uint32Array }
];

const min = 10,
  max = 340;

const diff = max - min;

const getNumberTypeFn = input => {
  if (typeof input === "object") {
    return Object.values(input)[0];
  } else {
    //return empty function or anything you want to
    return () => {};
  }
};
const numberTypefn = numberTypesList.find(x => Object.keys(x)[0] < diff);
console.log(getNumberTypeFn(numberTypefn));

https://r4jx15jz34.codesandbox.io/