Typescript 键入脚本-使用键Id合并数组中的对象
在类型脚本中,我有一个对象数组 [{id:1,名称:'A'},{id:1,名称:'B'},{id:2,名称:'X'},{id:2,名称:'Y'},{id:3,名称:'p'}] 如何使用键Id合并数组中的对象Typescript 键入脚本-使用键Id合并数组中的对象,typescript,Typescript,在类型脚本中,我有一个对象数组 [{id:1,名称:'A'},{id:1,名称:'B'},{id:2,名称:'X'},{id:2,名称:'Y'},{id:3,名称:'p'}] 如何使用键Id合并数组中的对象 [{id:1,名称:['A',B']},{id:2,名称:['X',Y']},{id:3,名称:'p'}]你不需要使用Typescript。这是典型的reduce任务 您应该编写简单的reducer,它将获取每个数据片段并构建最终对象,例如 const reduced = myArray.r
[{id:1,名称:['A',B']},{id:2,名称:['X',Y']},{id:3,名称:'p'}]你不需要使用Typescript。这是典型的
reduce
任务
您应该编写简单的reducer,它将获取每个数据片段并构建最终对象,例如
const reduced = myArray.reduce((memo, current) => {
// Add new entry, if not present
if (!memo[current.id]) {
memo[current.id] = {
id: current.id,
name: [current.name],
}
} else {
memo[current.id].name.push(current.name);
}
}, {});
// To convert above to array, do something like:
const finalArray = Object.values(reduced);
Typescript的唯一区别是这里的类型转换。可以在减少之前和之后为每个数组元素创建接口,例如
type arrayElt {
id: number;
name: string;
}
type reducedElt {
id: number;
name: string[];
}
然后将其与数组一起使用:
const myArray: arrayElt[] = /.../ // Here you have your array
减少后:
const reducedArray: reducedElt[] = /.../ // Here reducing code from above
请调整名称并尝试将类型粘在一起-不过,这应该是一个很好的起点;)
编辑:如果只有一个特定
id
的表示形式,那么您似乎需要将对象保留为普通对象,因此必须对类型使用union(因为特定属性可能是string[]
或string
)。我将让您自己去做,这样您就可以自己修补和解决它。只需使用reduce
函数即可实现
collection.reduce((a, b) => {
const {id, name} = b
let instance = a.find(i => i.id == id);
!instance ?
a.push({id, name: [name]}):
instance.name.push(name);
return a
}, [])
实现这一点的其他方法是使用
Map
// find unique keys using Map
var uniqueIds = [...new Set(collection.map(item => item.id))]
// loop over the collection and create final result
uniqueIds.map(id => ({
id,
name: collection.filter(i=> i.id == id).map(f => f.name)
}))
我会将所有键添加到一个集合中,其中每个键都是唯一的,然后过滤集合中每个键的结构并构建一个新结构。 在伪代码中:
set = array.map(x => x.id)
new arrayValue
for each (id in set){
value = array.filter(x => x.id == id).map(x => x.name)
arrayValue.add({"id":id, "name": value})
}
return ArrayValue
你需要尝试一些你自己的逻辑,如果它不起作用,我们可以提供帮助。