javascript - 我如何更好地编写这个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}
- 我需要用 javascript ES6 编写它
- 我不应该使用循环(for,while,repeat),但允许使用 foreach,如果我使用“reduce”功能可能会更好
- 候选人应按其毕业日期组织的姓名,年龄和电话返回。
- 应按字母顺序返回语言及其计数器。
请访问https://codepen.io/rillervincci/pen/NEyMoV?editors=0010查看我的代码。
解决方案
一种选择是首先reduce
进入candidates
子对象,同时push
将langauges
每个对象添加到数组中。
迭代后,对每个候选者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);