【问题标题】:Is it possible to use array iteration methods on ES6 Set instances?是否可以在 ES6 Set 实例上使用数组迭代方法?
【发布时间】:2016-02-12 22:53:54
【问题描述】:

我正在使用 ES6 Set 实例,我需要对它们应用一些转换。如果它们是数组,这些转换会很简单。这是一个例子:

let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = s.filter(val => val > 1); // TypeError, filter not defined
let n = Array.prototype.filter.call(s, val => val > 1); // []

我希望结果是一个新的 Set 或一个数组。我同样想使用其他数组理解方法,如filtermapreduce 等。我也希望在 ES6 Map 实例上也有类似的行为。

这可能吗,还是我需要使用 vanilla JS 数组?

【问题讨论】:

  • 根据 MDN,没有任何过滤方法,但您可以使用for (let item of s) 来制作自己的过滤方法。
  • 顺便说一句,filter、map、reduce 等不是“数组理解方法”——它们只是“数组方法”
  • @JaromandaX 好点。改变了。

标签: javascript arrays set ecmascript-6


【解决方案1】:

您可以使用

获取数组中 s 的值
Array.from(s.values())

Array.from documentation 声明它从类数组或可迭代对象创建一个新的 Array 实例。

Set.values 返回一个新的 Iterator 对象,其中包含按插入顺序排列的 Set 对象中每个元素的值。

所以你的代码变成了

let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = Array.from(s.values()).filter(val => val > 1)

【讨论】:

  • Array.from 正是我想要的。
【解决方案2】:

您不能直接在SetMap 对象上使用Array 方法。数组方法需要 .length[n] 索引,这不是 SetMap 的工作方式。

您可以使用Array.from(s)Set 转换为数组,也可以创建自己的方法来直接对SetMap 进行操作。如果您要经常这样做并且所需的最终结果是SetMap,那么最好不要转换为数组,修改然后再转换回来。另外,将 Map 转换为数组并不是那么简单,因为您既有键又有值(可能必须是对象数组)。

例如,您可以为 Set 对象创建自己的 .filter() 方法,如下所示:

Set.prototype.filter = function(fn) {
    let result = new Set();
    for (let val of this) {
       if (fn(val, this) === true) {
           result.add(val);
       }
    }
    return result;
}

let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = s.filter(val => val > 1); 


// log the output

// log output
document.write("Set {" + Array.from(n).join(", ") +"}");

可以为其他 Array 方法创建类似的方法。

【讨论】:

  • 我可能最终会做这样的事情,但我更喜欢一开始更简单。我将答案授予@Jaromanda X,因为他是第一个。
  • @AndrewEisenberg - 但是,如果你想得到一个 Set,真的没有理由转换为一个数组,然后再转换回一个集合,只是为了避免多写几行在我看来,用一种实用方法编写一次代码。
  • 此时不需要以 set 结束,因为它被用作 angularjs 过滤器的一部分。事实上,最后总是需要一个数组,因为顺序在 ui 中很重要。
  • @AndrewEisenberg - 好的。如果顺序很重要,那么我想知道为什么它首先出现在 Set 中。
  • 数据实际上存储在地图中,由 UI 不关心的索引键控。这是为了帮助快速进行服务器更新。 UI将根据情况将数据通过多个过滤器(例如,归约、映射、排序、过滤)后显示。
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 2014-09-22
  • 2018-08-05
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多