Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有多种类型的内联分析数组_Javascript_Arrays - Fatal编程技术网

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

Javascript 具有多种类型的内联分析数组,javascript,arrays,Javascript,Arrays,我有一个我无法控制的数据源,它为我提供了一个具有不同数据类型的数组,我需要在使用它之前对其进行处理。真正的数据源有两种以上的数据类型,但它们始终处于相同的已知顺序 我目前使用一个中间值(rawValues),但非常希望避免这种情况 const rawValues = getData(); // e.g. ["12.5", "42", "hello"] const [num1, num2, text] = [ Number(rawValues[0]), Number(rawValues

我有一个我无法控制的数据源,它为我提供了一个具有不同数据类型的数组,我需要在使用它之前对其进行处理。真正的数据源有两种以上的数据类型,但它们始终处于相同的已知顺序

我目前使用一个中间值(
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);
这样做的另一个好处是使转换更加灵活,但如果传入的数字不能由JavaScript标准数字类型准确表示,则可能会出现问题

重申一下我的问题——最好不创建任何临时变量,处理这些传入数据的最佳(或最惯用)方法是什么?这不是关于代码高尔夫(我不担心代码行),而是关于可读代码,它可以避免用临时值污染作用域

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

或:

它们总是处于相同的已知顺序

您可以将数组从
getData
解压到结果对象的属性中

let getData=function(){return[“12.5”,“42”,“hello”];}
让结果={};
[结果[“float”]、结果[“int”]、结果[“string”]=getData();
控制台日志(结果)
它们总是处于相同的已知顺序

您可以将数组从
getData
解压到结果对象的属性中

let getData=function(){return[“12.5”,“42”,“hello”];}
让结果={};
[结果[“float”]、结果[“int”]、结果[“string”]=getData();

控制台日志(结果)我将已知类型表示为类型数组(可以调用的构造函数):

然后根据需要处理传入的数据

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

上面的设计是为了满足您不需要任何中间变量的愿望,但我真的不认为担心这一点有什么意义。它们基本上是免费的,或者从自文档代码的角度来看,在某些情况下甚至是有益的。

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

然后根据需要处理传入的数据

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


上面的设计是为了满足您不需要任何中间变量的愿望,但我真的不认为担心这一点有什么意义。它们基本上是免费的,从自文档代码的角度来看,在某些情况下甚至是有益的。

为什么顺序是固定的?您可以使用数组。@KunalMukherjee所说的固定,我的意思是
getData()
函数总是以相同的顺序返回具有各种数据类型的数组。也就是说,您不必嗅探数据来找出它。有点像任意电子表格中的行,有字符串、数字、日期等,但没有有效的标签。为什么顺序是固定的?你可以使用数组。@KunalMukherjee所说的固定,我的意思是
getData()
函数总是以相同的顺序返回具有各种数据类型的数组。也就是说,您不必嗅探数据来找出它。有点像任意电子表格的行,有字符串、数字、日期等,但没有有效的标签这部分做什么?@kunal尽可能解析为一个数字,否则使用字符串当
n
“0”
?为什么我们不能使用数字构造函数?现在它将在空字符串上失败。尝试
isNaN(“”
isNaN(+“”)
+n|n)这部分做什么?@kunal尽可能解析为一个数字,否则使用字符串当
n
“0”
?为什么我们不能使用数字构造函数?现在它将在空字符串上失败。请尝试
isNaN(“”)
isNaN(+“”)
谢谢。在迄今为止的答案中,这似乎是最具可读性和灵活性的。它仍然有一个中间值,但它不是一个仅仅是数据副本的值。我从来没有想过这样做,我很高兴学习一种新的方法!还可以在类型数组上使用
.shift()
,并消除对索引的需要:
const-cook=raw.map(x=>types.shift()(x))@BenFletcher我会避免这种转移,因为它会破坏数组。我修改了答案,不使用中间变量。是的,在我的最终实现中,我使用类型数组作为传递到IIFE的参数,然后将它们逐个移开。我也不喜欢留下一个被破坏的数组,所以IIFE什么也不留下,只是类型列表仍然可读。@BenFletcher我不明白。即使您将数组传递到另一个函数,IIFE或其他函数,除非您从中复制移位将破坏它。谢谢。在迄今为止的答案中,这似乎是最具可读性和灵活性的。它仍然有一个中间值,但它不是一个仅仅是数据副本的值。我从来没有想过这样做,我很高兴学习一种新的方法!还可以在类型数组上使用
.shift()
,并消除对索引的需要:
const-cook=raw.map(x=>types.shift()(x))@BenFletcher我会避免这种转移,因为它会破坏数组。我修改了答案,不使用中间变量。是的,在我的最终实现中,我使用类型数组作为传递到IIFE的参数,然后将它们逐个移开。我也不喜欢留下一个被破坏的数组,所以IIFE什么也不留下,只是类型列表仍然可读。@BenFletcher我不明白。即使您将数组传递到另一个函数,IIFE或其他函数,除非您从中复制移位将破坏它。谢谢。这也是一个我没有考虑过的好方法。它不会强制将值转换为正确的类型,但这并不是一个很难添加的步骤。@BenFletcher-我觉得这些类型是已知的,如果是这样的话,您可以始终映射表达式右侧的类型,如其他一些答案所示。谢谢。这也是一个很好的方法
const types = [Number, Number, String];
const [num1, num2, text] = getData().map((x, i) => types[i](x));