js Array.prototype.filter.call() - 能否有人解释一下这段代码是如何工作的?

6

有人可以解释一下这段代码是如何工作的吗? 输出是一个向量,包含输入的字母但没有重复。

var uniqueInOrder = function (iterable) {
  return [].filter.call(iterable, (function (a, i) {
    return iterable[i - 1] !== a
  }));
}
console.log(uniqueInOrder("aaaaaBBBDSJJJJ"))
2个回答

5
让我们来分解一下: return [].filter.call(iterable,(function (a, i) { return iterable[i - 1] !== a })); * 我们正在返回一个数组。
* 使用 .filter.call(iterable, 允许我们在 iterable 上使用 Array.prototype.filter 方法,它是一个字符串(使函数将字符串视为字符数组)作为 call 获取的第一个参数是上下文。
* 过滤函数返回每个返回 true 的元素的子集。因此,在执行 return iterable[i - 1] !== a 时,每次我们都检查索引 i-1 中的元素,这基本上是先前的元素,是否不等于当前元素,即 a 如果它不相等,则返回 true,因此 a 元素是被返回的子集数组的一部分。
请注意,最容易理解的方法是进行调试,只需将此代码粘贴到开发人员工具栏控制台中。
 var uniqueInOrder = function (iterable)
    {debugger;
      return [].filter.call(iterable,(function (a, i) { return iterable[i - 1] !== a }));
    }
    console.log(uniqueInOrder("aaaaaBBBDSJJJJ"))

1
我认为你这部分有些错误:*return []*,所以我们正在返回一个数组。 - user663031
所以如果我理解正确,使用 {filter.call(iterable,} 我是在告诉它在可迭代变量上执行回调函数?我不明白为什么回调函数有两个参数,它们是什么。 - daymos
确切地说,是在可迭代对象上使用过滤器方法。因此回调函数会在可迭代对象的每个元素上执行。 - Saar
过滤器方法将这两个参数注入回调方法。 - Saar
3
一个数组方法如何知道如何将一个字符串处理为一系列字符? - thetrystero
显示剩余3条评论

0

@daymos 回调函数被调用时会传递三个参数。请参见这里


欢迎来到stackoverflow。请不要仅发布链接作为您的答案,因为链接会随着时间而失效。请从文章中提取相关信息并在此处附上解释。 - jtate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接