Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 键入脚本-使用键Id合并数组中的对象_Typescript - Fatal编程技术网

Typescript 键入脚本-使用键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'},{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.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

你需要尝试一些你自己的逻辑,如果它不起作用,我们可以提供帮助。