在Type Script中,我有一个对象数组,
[{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' }]
答案 0 :(得分:1)
您不需要打字稿。这是典型的const instance = axios.create({
baseURL: 'api-url.com',
transformRequest: [
(data, headers) => {
data.append('myKey','myValue');
return data;
},
]
});
任务。
您应该编写简单的化简器,以获取每条数据并构建最终对象,例如
reduce
Typescript的唯一区别是此处正确的类型转换。您可以在缩小前后为每个数组元素创建接口,例如
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);
然后将其用于数组:
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
或string[]
)。我会留给您的,这样您就可以自己动手解决一下。
答案 1 :(得分:1)
使用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)
}))
答案 2 :(得分:0)
我将所有密钥添加到集合中,其中每个密钥都是唯一的,然后过滤集合中每个密钥的结构并构建新的结构。 用伪代码:
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