将所有相似的值合并到一个数组中

时间:2020-10-09 00:15:38

标签: typescript ecmascript-6 interface reduce

这里有一个对象Version

 /** Model **/
 interface Version {
   name: string
   version: number
   someotherproperty: string
   conditional: boolean
 } 

 /** Expected Object Outcome **/
 interface Application {
   name: string
   versions: Version[]
 }

/** Incomplete constant that should return an Application Array. **/
const data = listOfVersions.reduce((a, item) => return Application[]) 

我正在尝试创建一个使用ES6 reduce来按名称生成版本列表的函数。

我真的不想扩展下面的可怕代码,我想替换它:

for(var j=0;j<data.length;j++){
  var current = data[j];
  for(var i=j+1;i<data.length;i++){
    if(current.name = data[i].name){
      if(!isArray(current.version))
        current.version = [ current.version ];
      if(isArray(data[i].version))
         for(var v=0;v<data[i].version.length;v++)
           current.version.push(data[i].version[v]);
      else
        current.version.push(data[i].version);
      data.splice(i,1);
      i++;
    }
  }
}

1 个答案:

答案 0 :(得分:1)

制作一个按名称索引的对象,该对象的值包含一个版本数组,然后获取该对象的值:

const versionsByName: {[name: string]: Application} = {};
for (const { name, version } of listOfVersions) {
  if (!versionsByName[name]) {
    versionsByName[name] = { name, versions: [] };
  }
  versionsByName[name].versions.push(version);
}
const output = Object.values(versionsByName);

使用reduce做相同的事情是可能的,但我认为这并不是很合适-它需要更多的代码,一眼就很难理解。有关此主题,请参见V8开发人员的this video