我想这里是一个非常基本的问题,但我找不到一个答案-我有一堆要从中提取唯一值的数组。每个数组都有一个应聘者精通的技能列表,我想构建一个数组,列出列出的所有技能。
这是我拥有的代码,其中列出了人员姓名和他们具有的技能:
const people = [
{ name: "Mike", skills: ["JavaScript", "Java", "Python"] },
{ name: "Bob", skills: ["Python", "Java"] },
];
我想做的是建立一个数组,上面列出的每个技能只会出现一次,无论其在上面的数组中出现了多少次。我尝试过使用Set功能,如下所示:
let options = [...new Set(people)]
但是那点药对我有用。理想情况下,我希望输出为:
options["JavaScript", "Java", "Python"]
,每个唯一值仅表示一次。任何帮助表示赞赏。
答案 0 :(得分:2)
使用Array.flatMap()
将所有技能组合到单个数组中,转换为Set以仅获取唯一值,然后传播回数组:
const people = [
{ name: "Mike", skills: ["JavaScript", "Java", "Python"] },
{ name: "Bob", skills: ["Python", "Java"] },
];
const skills = [...new Set(people.flatMap(o => o.skills))];
console.log(skills);
答案 1 :(得分:0)
您应该使用lodash
。
然后,您可以使用_.difference(array1,array2);
祝你好运!
答案 2 :(得分:0)
使用Set的想法很好,但是您需要将skills
添加到集合中,而不需要整个人员。解决此问题的一种方法是遍历所有技能,然后将它们添加到集合中:
const people = [
{name: "Mike", skills: ["JavaScript", "Java", "Python"]},
{name: "Bob", skills: ["Python", "Java"]},
];
let skills = new Set();
people.forEach(p => p.skills.forEach(s => skills.add(s)));
console.log("skills => ", [...skills]);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
答案 3 :(得分:0)
我还将向此.flatMap()添加一个polyfill,因为IE完全不支持。
if (!Array.prototype.flatMap) {
Object.defineProperty(Array.prototype, "flatMap", {
value: function(callback, thisArg) {
return this.map(callback, thisArg).reduce((a, b) => a.concat(b), []);
},
configurable: true,
writable: true
});
}
const people = [
{ name: "Mike", skills: ["JavaScript", "Java", "Python"] },
{ name: "Bob", skills: ["Python", "Java"] },
];
const skills = [...new Set(people.flatMap(o => o.skills))];
console.log(skills);
答案 4 :(得分:0)
要获得预期结果,请使用以下使用reduce和Set
const people = [
{ name: "Mike", skills: ["JavaScript", "Java", "Python"] },
{ name: "Bob", skills: ["Python", "Java"] },
];
console.log(people.reduce((acc, v) => {
acc.push(...v.skills)
return [...new Set(acc)]
}, []))
答案 5 :(得分:0)
冗长得多,但是:
for (let individual of people) {
for (let skill of individual.skills) {
options.indexOf(skill) < 0 ? options.push(skill) : '';
}
}
可以做到。