【问题标题】:Can somebody explain this particular use of the method map?有人可以解释方法映射的这种特殊用途吗?
【发布时间】:2020-12-23 06:12:27
【问题描述】:

我认为这是代码战挑战的解决方案,您需要在不使用反向方法且仅使用 30 位备用的情况下反转数组:

reverse=a=>[...a].map(a.pop,a)

现在我知道使用地图的方式是这样的:

array.map(item => somethingelse)

所以我真的不明白在这种情况下如何使用地图,有人可以解释一下吗?

【问题讨论】:

  • @Talmacel Marian Silviu Map 对数组的每个元素调用定义的回调函数,并返回包含结果的数组。最后,pop 从数组中删除最后一个元素并返回它。您可以通过类似的方式实现相同的目标,例如:function reverse2(a) { return [].concat(a).map(a.pop, a); }。所以它通过回调迭代数组,并反向返回新数组。

标签: javascript arrays methods


【解决方案1】:

.map 接受的第一个参数是每次迭代运行的回调。

array.map(item => somethingelse)

等价于

const callback = item => somethingelse;
array.map(callback);

.map 接受的第二个参数是运行回调时要使用的 this 值。举例说明:

const obj = {};
const arr = [0, 1, 2];
const arr2 = arr.map(
  function() { console.log(this === obj) },
  obj
);

.map 中引用this 通常很奇怪,但这是可能的,通过传递第二个参数,您可以确定它所指的内容。

Array.prototype.pop 需要一个调用上下文 - 一个 this 值 - 以了解您尝试从哪个数组中弹出项目,因此在原始代码中:

reverse=a=>[...a].map(a.pop,a)

a 必须作为第二个参数传递,.map 才能工作。

a.pop 在这里等同于Array.prototype.map,因为它是作为回调传递的:

// Equivalent code:
reverse=a=>[...a].map(Array.prototype.pop, a);

[...a].map( 部分用作调用.pop() n 次的快捷方式,其中n 是原始数组的长度。每个返回的项都会在新数组中产生一个新项 - 原始数组中的最后一项首先弹出并放入新数组中的第一个位置,依此类推。

【讨论】:

  • 很好的答案,自从我玩弄 Javascript 以来已经有一段时间了。我最初的评论很离谱,但信息量很大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多