首页 > 解决方案 > 将所有相似的值组合到一个数组中

问题描述

在这里我有一个对象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++;
    }
  }
}

标签: typescriptecmascript-6interfacereduce

解决方案


创建一个按名称索引的对象,在其值中包含一个版本数组,然后获取对象的值:

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 开发人员关于该主题的此视频


推荐阅读