【问题标题】:JS returning an array consisting of unique arraysJS 返回一个由唯一数组组成的数组
【发布时间】:2017-08-26 07:20:48
【问题描述】:

我已经通过 OhJeez 在这里找到了解决方案:How to get an array of unique values from an array containing duplicates in JavaScript?

array.filter(function() {
  var seen = {};
  return function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  };
}());

我想问的是如何理解上面的代码。我不明白的部分是 var seen 如何保留其密钥。每次迭代不会重置为空的哈希/对象吗?

编辑:我想我了解闭包的工作原理,但这并不能解决我的问题。据我了解, Array.prototype.filter 将数组的每个元素循环到回调函数,在本例中为匿名函数 'var seen = {}; return function(element, index, array) {return !(element in seen) && (seen[element] = 1);};.这反过来又返回里面的函数。

我的问题是,不应该每次迭代都运行“var seen = {}”这一行吗?那怎么能看到保留它的元素呢?

【问题讨论】:

标签: javascript arrays filter


【解决方案1】:
array.filter(function() {
  var seen = {};
  return function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  };
}());

你可以把它想象成

var seen = {}
array.filter(function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  })

两者都将具有相同的输出,只有差异 var 在第一种情况下仍然是本地范围,这很好。

当您调用 array.filter() 时,第一个参数是一个自调用函数,在传递给 array.filter() 之前会对其进行评估;

因此它将seen 保持在其关闭状态。

【讨论】:

  • @DionChan 如果有帮助,请接受此答案。谢谢
【解决方案2】:

这段代码是不必要的复杂,即使是经验丰富的 JS 程序员也会在他们试图弄清楚它在做什么的时候停下来一分钟。改写为

function filter() {
  var seen = {};

  return array.filter(function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  });
}

关键是我们需要一个哈希(这里称为seen)并且必须在某个地方声明它。通常,我们只是在一些适当的周围范围内声明它。无论出于何种原因,程序员都想避免这样做,所以他/她在传递给filter 的函数周围引入了另一个作用域。正如我所说,这是令人困惑和不必要的。

【讨论】:

  • 假设你的代码意味着函数 filter(array) {...} ;我当然同意你的有道理。但我还是想知道为什么原来的代码有效
【解决方案3】:

在这里,我们可以用两件事来解释这一点。

  1. JS 是具有函数变量范围的语言,因此needed 在它定义的匿名函数中可见。
  2. 您可以将其视为array.filter 的参数的匿名自执行函数恰好用于管理变量范围并防止needed 每次迭代都被重置。该函数被立即调用,它返回array.filter 的真正回调,但在此回调的范围内保持needed

匿名自执行函数是 JS 中的一个巨大工具。例如,您可以通过article 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多