首页 > 解决方案 > 我如何更好地编写这个reportCandidates的功能?

问题描述

这是名为 CandidateArray 的数组中的输入数据:

[ 
 {"name":"george","languages":["php","javascript","java"],"age":19,"graduate_date":1044064800000,"phone":"32-991-511"},
 {"name":"anna","languages":["java","javascript"],"age":23,"graduate_date":1391220000000,"phone":"32-991-512"},
 {"name":"hailee","languages":["regex","javascript","perl","go","java"],"age":31,"graduate_date":1296525600000,"phone":"32-991-513"}
]

由于该功能,我需要在此集合中进行转换:

{candidates: [
    {name: "George", age: 19, phone: "32-991-511"},
    {name: "Hailee", age: 31, phone: "32-991-513"},
    {name: "Anna", age: 23, phone: "32-991-512"}
],
languages: [
    {lang:"javascript",count:1}, 
    {lang:"java", count:2}, 
    {lang:"php", count:2}, 
    {lang:"regex", count:1}
]}

函数 repCandidates:

const reportCandidates = (candidatesArray) => { return repObject}

请访问https://codepen.io/rillervincci/pen/NEyMoV?editors=0010查看我的代码。

标签: javascriptarraysjsonsortingcollections

解决方案


一种选择是首先reduce进入candidates子对象,同时pushlangauges每个对象添加到数组中。

迭代后,对每个候选者candidates的属性进行排序并删除,然后再次使用将数组转换为按语言索引的数组,每次递增属性:graduate_datereducelanguagescount

const input = [{
  "name": "george",
  "languages": ["php", "javascript", "java"],
  "age": 19,
  "graduate_date": 1044064800000,
  "phone": "32-991-511"
}, {
  "name": "anna",
  "languages": ["java", "javascript"],
  "age": 23,
  "graduate_date": 1391220000000,
  "phone": "32-991-512"
}, {
  "name": "hailee",
  "languages": ["regex", "javascript", "perl", "go", "java"],
  "age": 31,
  "graduate_date": 1296525600000,
  "phone": "32-991-513"
}];


const output = input.reduce((a, { languages, ...rest }) => {
  a.candidates.push(rest);
  a.languages.push(...languages);
  return a;
}, { candidates: [], languages: [] });

output.candidates.sort((a, b) => a.graduate_date - b.graduate_date);
output.candidates.forEach(candidate => delete candidate.graduate_date);

output.languages = Object.values(
  output.languages.reduce((a, lang) => {
    if (!a[lang]) a[lang] = { lang, count: 0 };
    a[lang].count++;
    return a;
  }, {})
);
output.languages.sort((a, b) => a.lang.localeCompare(b.lang));

console.log(output);


推荐阅读