2016-12-15 61 views
0

的陣列時,假設我有一個數組,看起來像:TS2345錯誤操作對象

let arr = [{field: ["alice"]}, {field : ["bob", "charlie"]} 

我希望能夠Concat的所有值,而無需編寫嵌套循環for。 我到目前爲止已經做到了這一點:

arr.reduce((a, b) => a.field.concat(b.field)) 

的問題,因爲我看到這一點,該陣列的類型,可以說arr : Array<MyObject>,改變當映射或類似的東西。

即時得到一個TS2345錯誤

...是不能分配給類型的參數...

只是爲了澄清事實,其結果應該是相同的結果如下。

let result = []; 
for (let i = 0; i < arr.length; i++) { 
    for (let j = 0; j < arr[i].field.length; j++) { 
     result.push(arr[i].field[j]) 
    } 
} 

對不起,我不能分享我的真實代碼,但這是確切的問題。 由於某些原因,這對Chrome的開發人員工具有效,但在嘗試編譯我的代碼時無法使用。

+0

只是爲了:

[{fields: ["alice", "bob", "charlie"] }] 

這與計算澄清,您添加的for循環已驗證可以正常工作,對吧?問題在於TS編譯reduce函數是以同樣的方式工作嗎?是的,這個循環的作用是 – Katana314

+0

。這個問題是由於在一次concatanation之後數組[0]與其他數據類型不同而造成的,所以下一次reduce調用根本不會是類型安全的。通過使用Map之前,我們選擇每個項目是所需的類型,然後調用所有這些函數 –

回答

2
const arr: Array<MyObject> = [{ field: ["alice"] }, { field: ["bob", "charlie"] }]; 

const result: Array<string> = arr.map(obj => obj.field) 
           .reduce((a, b) => a.concat(b)); 
+0

非常感謝 –

0

那麼,結果將是:

["alice", "bob", "charlie"] 

當我想你想:

[{ fields: arr.reduce((a, b) => a.field.concat(b.field)) }] 
+0

我沒有得到它與我所說的有什麼不同 –

+0

好吧,重點是有一個數組的差異是一個與包含一個對象的數組相比,名稱列表帶有一個參數「fields」,其中包含一個名稱列表。對不起,可能是你已經在未顯示的代碼中考慮過的東西。 – Katana314

+0

可以說數組內的對象是模型/類。 我不明白這是如何工作的。我試過了。 –