类型脚本-使用键ID合并数组中的对象

时间:2018-11-09 12:30:37

标签: typescript

在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' }]

3 个答案:

答案 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 的一个代表,您似乎需要将对象保留为纯对象,因此您必须对类型使用并集(因为特定属性可以是idstring[])。我会留给您的,这样您就可以自己动手解决一下。

答案 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