簡體   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