2016-12-15 203 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

可以说数组内的对象是模型/类。 我不明白这是如何工作的。我试过了。 –