javascript - 我怎样才能更好地写出这份报告候选人的功能呢?

标签 javascript arrays json sorting collections

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

[ 
 {"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}

  • 我需要用 javascript ES6 编写
  • 我不应该使用循环(for、while、repeat)但是 foreach 是允许的,如果我使用“reduce”函数会更好
  • 候选人应按毕业日期排列的姓名、年龄和电话返回。
  • 应按字母顺序返回语言及其计数器。

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

最佳答案

一个选择是首先将 reduce 放入 candidates 子对象中,同时 pushing langauges 每个到一个数组。

迭代后,对candidates进行排序,移除每个candidates的graduate_date属性,然后再次使用reduce转换languages 数组转换为一个按语言索引的数组,每次递增 count 属性:

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);

关于javascript - 我怎样才能更好地写出这份报告候选人的功能呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53424524/

相关文章:

javascript - JSON.stringify 似乎无法按预期工作

javascript - Chrome : Add local JavaScript SourceMap possible?

javascript - 如何从 AJV 错误中获取 "title"?

javascript - 通过选择列表更改的按钮 href 将无法解析(javascript :window. open(window.variable))

java - 特殊的 OutputStream 根据输入数据量进入内存和文件

javascript - PHP中的数组,Json

javascript - 在 JavaScript ES6 中,for-in 循环和 for-of 循​​环中,变量 i 在 block 的每次迭代后不再存在?

比较数组元素

c++ - 检查指针是否指向数组

javascript - 我如何为这个庞大的对象列表中的每个对象添加一个额外的键和值