繁体   English   中英

在 TypeScript 中展平数组数组

[英]Flatten array of arrays in TypeScript

我想将string[][]扁平化为string[]

数十个 SO 答案中给出的建议是: [].concat(...arrays)

但这给了我这个错误:

“string[]”类型的参数不可分配给“ConcatArray”类型的参数。
属性“切片”的类型不兼容。
类型 '(start?: number | undefined, end?: number | undefined) => string[]' 不能赋值给类型 '(start?: number | undefined, end?: number | undefined) => never[]' .
类型 'string[]' 不能分配给类型 'never[]'。
类型 'string' 不能分配给类型 'never'。

我尝试的另一种方法是:

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar = [].concat(...foo);

这给出了类似的错误:

“string[]”类型的参数不可分配给“ConcatArray”类型的参数。

为什么它对除我之外的所有人都有效?

尝试这个:

 const a = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]] const result = a.reduce((accumulator, value) => accumulator.concat(value), []); console.log(result)

您可以使用flat()来展平数组

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar = foo.flat()

日志

console.log(bar)   // a,b,c,a,b,c,a,b,c 

更新

通过将类型更正为 string[],您还可以使用concat

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar : string[] = []
bar = bar.concat(foo[0], foo[1], foo[2])

这是最简单的选择:

let bar = ([] as string[]).concat(...foo);

就像@Kokodoko 的方法一样,但带有内联类型。

.flat() 也会给出类型错误。 您可以使用泛型来解决这个问题

 let st : string[][] | Array<string> = [['a'] , ['b']] let bar = [].concat(...st); console.log(bar)

无论哪种方式,你的电话。 只要知道你的类型声明是不正确的。

这是一个通用的解决方案:

function flatten<T>(arr: T[][]): T[] {
  return ([] as T[]).concat(...arr);
}

我相信你有 strictNullCheck: true

没有上下文类型的空数组([].concat(arg) 中的 [])在 strictNullChecks 下被推断为 never[]。 并且 never 不能从任何其他类型分配。

([] as any[]).concat(foo); 应该做的伎俩

编码

const res = [].concat(...foo);

应该管用。 我猜这是 tsconfig 中的错误配置,导致您出现该错误。 确保 tsconfig 的lib数组中至少有es2015 (更好的es2018 )。 要使新flat如 kokodoko 所示工作,请确保还添加esnext

"lib": [
  "es2018",
  "dom",
  "esnext"
]

对于更深嵌套的数组数组,例如: [1, 2, 3, [4, [5, [6, [7]]]]]

type NestedArray<T> = Array<NestedArray<T> | T>;

const flatten = <T>(input: NestedArray<T>, acc: T[] = []): T[] => {
  return input.reduce((_: T[], current) => {
    if (Array.isArray(current)) return flatten(current, acc);  
    acc.push(current);
    return acc;
  }, []);
};

用法:

console.log(flatten([1, 2, 3, [4, [5, [6, [7]]]]]));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM