TTY*_*358 9 javascript typescript
假设我想创建一个zip函数:
function zip(arrays){
// assume more than 1 array is given and all arrays
// share the same length
const len = arrays[0].length;
const toReturn = new Array(len);
for (let i = 0; i < len; i++){
toReturn[i] = arrays.map(array=>array[i]);
}
return toReturn;
}
console.log(zip([
[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12],
]));
/*
Output:
(3) [Array(4), Array(4), Array(4)]
0: (4) [1, 4, 7, 10]
1: (4) [2, 5, 8, 11]
2: (4) [3, 6, 9, 12]
*/
Run Code Online (Sandbox Code Playgroud)
为了在所有数组都包含相同类型的元素时定义此函数:
function zip<T>(arrays: T[][]): T[][]{/* codes omited here */}
Run Code Online (Sandbox Code Playgroud)
然而,当数组具有不同类型的元素时,我对如何使用泛型类型来完成类型定义感到困惑。
const zipedResult = zip([[1,2,3],[true,false,true],['a','b','c']]);
// error raises: Type 'false' is not assignable to type 'number'.(2322)
Run Code Online (Sandbox Code Playgroud)
我想要的是
[[1,2,3],[true,false,true],['a','b','c']]
Run Code Online (Sandbox Code Playgroud)
可以自动推断为,(number|boolean|string)[][]无需编写as (number|boolean|string)[][]
或什至推断为,推断[number[],boolean[],string[]]结果为zip[number, boolean, string][]
我应该如何正确输入定义zip来完成这些功能?
我认为做到这一点的唯一方法是zip为您想要处理的每个大小的数组定义一个不同的函数(因为我们需要能够准确说出zip 结果的每个部分中的内容):
const zip3 = <T, U, V>(arrays: [T[], U[], V[]]): [T, U, V][] => {
const len = arrays[0].length;
const toReturn: [T, U, V][] = new Array(len);
for (let i = 0; i < len; i++){
toReturn[i] = [arrays[0][i], arrays[1][i], arrays[2][i]];
}
return toReturn;
};
const result = zip3([
[1,2,3],
[true, false, true],
[7,8,9],
]);
console.log(result);
Run Code Online (Sandbox Code Playgroud)
希望有人可以进来并展示一种更好的方法来做到这一点,而不必根据您想要压缩的数组数量重新定义函数;
| 归档时间: |
|
| 查看次数: |
2893 次 |
| 最近记录: |