【问题标题】:How to convert Set to Array?如何将集合转换为数组?
【发布时间】:2013-12-02 21:42:11
【问题描述】:

Set 似乎是创建具有保证唯一元素的数组的好方法,但它没有公开任何获取属性的好方法,除了生成器 [Set].values,它在mySet.values.next() 的尴尬方式。

如果您可以在 Sets 上调用 map 和类似函数,那就没问题了。但你也不能这样做。

我已经尝试过Array.from,但似乎只将类数组(NodeList 和 TypedArrays ?)对象转换为 Array。再试一次:Object.keys不适用于Sets,Set.prototype没有类似的静态方法。

所以,问题是:有没有方便的内置方法来创建具有给定 Set 值的数组?(元素的顺序并不重要)。

如果不存在这样的选项,那么也许有一个很好的惯用单线来做到这一点?喜欢,使用for...of,还是类似的?

【问题讨论】:

    标签: javascript arrays collections syntax ecmascript-harmony


    【解决方案1】:

    如果不存在这样的选项,那么也许有一个很好的惯用语 单线这样做?喜欢,使用 for...of,还是类似的?

    确实,有几种方法可以将Set 转换为Array

    使用Array.from

    let array = Array.from(mySet);
    

    只需spreading 列在一个数组中

    let array = [...mySet];
    

    老式的方式,迭代并推送到一个新数组(集合确实有forEach

    let array = [];
    mySet.forEach(v => array.push(v));
    

    以前使用非标准的,现在已弃用的数组解析语法:

    let array = [v for (v of mySet)];
    

    【讨论】:

    • 这在 Safari(8) 或 Chrome (41) 中不起作用。但它确实适用于 Firefox(35)。
    • var array = [v for (v of mySet)];chrome 46 中不起作用
    • 我认为最优雅的方式就是[...mySet]
    • @WojciechBednarski l33t 并不优雅。如果有任何例子,那就是Array.from(mySet);
    • 只是想补充一点,[...mySet] 在使用 Typescript 编译时会出现问题(请参阅this issue),因此如果您打算在不久的将来转换为 Typescript,使用Array.from(mySet) 可能更安全。
    【解决方案2】:

    通过 https://speakerdeck.com/anguscroll/es6-uncensored 由 Angus Croll

    事实证明,我们可以使用spread操作符:

    var myArr = [...mySet];
    

    或者,或者,使用Array.from

    var myArr = Array.from(mySet);
    

    【讨论】:

    • 为什么要投反对票?这种方法有什么问题吗?或者有人试图在 IE11 中执行此代码 失败 ? ;)
    • 我没有投反对票,但我在最新版本的 Chrome 中尝试过,但失败了,所以这不仅仅是一个 IE 问题。
    • 请参阅kangax.github.io/compat-table/es6 了解或多或少的最新支持图表。目前,在所有桌面浏览器中,只有 FF 和 IE TP(又名 Spartan,又名 MS 非 IE 浏览器)支持 Array.from...
    • 看起来 Firefox 是唯一支持Array.from 的浏览器。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 在这里你可以为 Chrome 启用它chrome://flags/#enable-javascript-harmony 记住它是实验性的,暂时不要认为这是一个很好的开发解决方案。
    【解决方案3】:

    假设您只是暂时使用Set 来获取数组中的唯一值,然后转换回数组,请尝试使用:

    _.uniq([])
    

    这依赖于使用underscorelo-dash

    【讨论】:

    • 不幸的是唯一的跨浏览器解决方案
    【解决方案4】:

    也许迟到了,但你可以这样做:

    const set = new Set(['a', 'b']);
    const values = set.values();
    const array = Array.from(values);
    

    这应该可以在支持 ES6 的浏览器中正常工作,或者如果您有一个可以正确填充上述功能的 shim。

    编辑:今天你可以使用@c69 的建议:

    const set = new Set(['a', 'b']);
    const array = [...set]; // or Array.from(set)
    

    【讨论】:

    • 看来使用set.entries() 你会得到一对数组。您可以使用set.values() 来获取普通数组。
    • @ShimonRachlenko true,用户确实要求这样做。
    • 你可以使用var array = Array.from(set);
    • 这个答案是错误的。您不需要拨打.entries.values。正如上面提到的@Buffalo - Array.from(set) 就足够了。
    • @c69 这是真的。在给出这个答案时,Array.from() 没有按预期工作。但现在 spread 和 Array.from() 都可以正常工作。
    【解决方案5】:

    使用spread Operator得到你想要的结果

    var arrayFromSet = [...set];
    

    【讨论】:

      【解决方案6】:

      在我的情况下,解决方案是:

      var testSet = new Set();
      var testArray = [];
      
      testSet.add("1");
      testSet.add("2");
      testSet.add("2"); // duplicate item
      testSet.add("3");
      
      var someFunction = function (value1, value2, setItself) {
          testArray.push(value1);
      };
      
      testSet.forEach(someFunction);
      
      console.log("testArray: " + testArray);
      

      value1 equals value2 => The value contained in the the current position in the Set. The same value is passed for both arguments

      在IE11下工作。

      【讨论】:

        【解决方案7】:

        使用 Set 并将其转换为数组与复制数组非常相似...

        因此您可以使用相同的方法来复制数组,这在 ES6

        中非常简单

        例如,您可以使用...

        想象一下你在下面有这个集合:

        const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);
        

        您可以使用以下方法简单地转换它:

        const b = [...a];
        

        结果是:

        ["Alireza", "Dezfoolian", "is", "a", "developer"]
        

        一个数组,现在您可以使用所有可用于数组的方法...

        其他常见的做法:

        const b = Array.from(a);
        

        或使用如下循环:

        const b = [];
        a.forEach(v => b.push(v));
        

        【讨论】:

          【解决方案8】:

          下面的代码从一个数组创建一个集合,然后使用... 运算符。

          var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
          var set=new Set(arr);
          let setarr=[...set];
          console.log(setarr);
          

          【讨论】:

          • ..这是什么?
          【解决方案9】:

          这是一种仅从数组中获取唯一原始值的简单方法。如果将数组转换为 Set 并在此之后进行从 Set 到数组的转换。此转换仅适用于原始值,对于数组中的对象无效。自己试试吧。

              let myObj1 = {
                  name: "Dany",
                  age: 35,
                  address: "str. My street N5"
              }
          
              let myObj2 = {
                  name: "Dany",
                  age: 35,
                  address: "str. My street N5"
              }
          
              var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
              console.log(myArray);
          
              var mySet = new Set(myArray);
              console.log(mySet);
          
              console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items
          
              let uniqueArray = [...mySet];
              console.log(uniqueArray); 
              // Here you will see your new array have only unique elements with raw 
              // values. The objects are not filtered as unique values by Set.
              // Try it by yourself.
          

          【讨论】:

            【解决方案10】:

            最简单的答案

            只需在 [] 内展开集合

            let mySet = new Set()
            mySet.add(1)
            mySet.add(5)
            mySet.add(5) 
            let arr = [...mySet ]
            

            结果:[1,5]

            【讨论】:

              【解决方案11】:

              我希望先从数组中删除重复项,然后再尝试排序。 从新数组中返回第一个元素。

                  function processData(myArray) {
                      var s = new Set(myArray);
                      var arr = [...s];
                      return arr.sort((a,b) => b-a)[1];
                  }
                  
                  console.log(processData([2,3,6,6,5]);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-12-17
                • 2019-01-05
                • 1970-01-01
                • 1970-01-01
                • 2018-02-26
                相关资源
                最近更新 更多