用唯一值填充数组

时间:2019-06-13 16:19:37

标签: javascript arrays unique

我想这里是一个非常基本的问题,但我找不到一个答案-我有一堆要从中提取唯一值的数组。每个数组都有一个应聘者精通的技能列表,我想构建一个数组,列出列出的所有技能。

这是我拥有的代码,其中列出了人员姓名和他们具有的技能:

const people = [
  { name: "Mike", skills: ["JavaScript", "Java", "Python"] },
  { name: "Bob", skills: ["Python", "Java"] },
];

我想做的是建立一个数组,上面列出的每个技能只会出现一次,无论其在上面的数组中出现了多少次。我尝试过使用Set功能,如下所示:

let options = [...new Set(people)]

但是那点药对我有用。理想情况下,我希望输出为:

options["JavaScript", "Java", "Python"]

,每个唯一值仅表示一次。任何帮助表示赞赏。

6 个答案:

答案 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) : '';
  }
}

可以做到。