这里有一个对象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++;
}
}
}
答案 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。