【问题标题】:Filling Array with unique values用唯一值填充数组
【发布时间】:2019-06-13 16:19:37
【问题描述】:

我认为这是一个非常基本的问题,但我找不到答案 - 我有一堆数组,我想从中提取唯一值。每个数组都有一个候选人精通的技能列表,我想构建一个数组来列出所有已列出的技能。

这是我的代码,列出了一个人的姓名和他们拥有的技能:

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

我要做的是构建一个数组,上面列出的每个技能只出现一次,无论它在上面的数组中出现多少次。我尝试使用 Set 功能如下:

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

但这对我有用。理想情况下,我希望输出类似于:

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

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

【问题讨论】:

    标签: javascript arrays unique


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你应该使用lodash

      然后,你可以使用_.difference(array1,array2);

      祝你好运!

      【讨论】:

        【解决方案3】:

        使用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;}

        【讨论】:

          【解决方案4】:

          我还会在这个 .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);

          【讨论】:

            【解决方案5】:

            为了达到预期的效果,使用下面的使用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)]
            }, []))

            【讨论】:

              【解决方案6】:

              比它需要的更冗长,但是:

              for (let individual of people) {
                for (let skill of individual.skills) {
                  options.indexOf(skill) < 0 ? options.push(skill) : '';
                }
              }
              

              可以。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-08-18
                • 1970-01-01
                • 2020-01-07
                • 2018-03-08
                • 2013-07-12
                • 2021-05-09
                • 1970-01-01
                相关资源
                最近更新 更多