内联解析具有多种类型的数组

时间:2018-05-11 18:29:42

标签: javascript arrays

我的控件外部有一个数据源,它为我提供了一个数组,其中包含我在使用之前需要处理的不同数据类型。真正的数据源有两种以上的数据类型,但它们总是处于相同的已知顺序。

我目前使用中间值(rawValues),但非常想避免这种情况。

const rawValues = getData(); // e.g. ["12.5", "42", "hello"]

const [num1, num2, text] = [
  Number(rawValues[0]), 
  Number(rawValues[1]), 
  rawValues[2]
];

我知道的唯一内联选项会有点凌乱.map(),例如:

const [num1, num2, text] = getData()
  .map((data, i) => i < 2 ? Number(data) : data);

我也想避免使用这种方法的“神奇数字2”和可论证的不可读性。

我想过只测试每个数组成员的弱相等性,以便在地图中使用强制性(Number(data) == data)

const [num1, num2, text] = getData()
  .map((data, i) => Number(data) == data ? Number(data) : data);

这样做的另一个好处是可以使转换更加灵活,但如果传入的数字不能完全由JavaScript标准数字类型表示,则存在问题。

重申我的问题 - 处理这些传入数据的最佳(或最惯用)方法是什么,最好不创建任何临时变量?这不是关于代码打高尔夫球(我不担心#行代码),而是关于避免使用临时值来污染范围的可读代码。

2 个答案:

答案 0 :(得分:3)

我将已知类型表示为类型数组(可以调用的构造函数):

const types = [Number, Number, String];

然后将输入数据处理为

const [num1, num2, text] = getData().map((x, i) => types[i](x));

上述内容旨在满足您不希望出现任何中间变量的愿望,但我并不认为有必要担心这一点。从自我文档代码的角度来看,它们基本上是免费的,甚至是有益的。

答案 1 :(得分:1)

 const [num1, num2, text] = getData().map(n => !n || isNaN(+n) ? n : +n);

或者:

let [num1, num2, text] = getData();
num1 = +num1;
 num2 = +num2;