【问题标题】:What is .map() doing in this situation?.map() 在这种情况下在做什么?
【发布时间】:2017-09-15 00:49:24
【问题描述】:

使用 Chrome 控制台,这是我的输入和输出:

[0].map(Array);

[[0, 0, [0]]]; // output

这里发生了什么?

编辑

这让我好奇的原因是因为类似

[0].map(String);

会回来

["0"];

不是

["0", "0", "String"]

【问题讨论】:

  • 我假设是因为他总是需要一些 Javascript WTF 才能感到快乐
  • 哦,它只是 ['10', '10', '10'].map(parseInt) 的一个不那么 wtf-y 的变体
  • 另一种奇怪的.map() 行为:stackoverflow.com/questions/14528397/… 通常,在将.map() 与带有多个参数的函数一起使用时必须小心。
  • 随便[0].map(console.log)
  • @Jacksonkr:感谢您的回答。我认为它是这样的:我写了一条评论,解释说看到 JS WTF 让我很高兴我不必经常使用该语言。有人问如果我不喜欢这种语言,为什么我会看 JS 问题。 npst 回答,前两个 cmets 被删除。有趣的是,他的评论仍然得到支持,是的。

标签: javascript


【解决方案1】:

.map() function 使用三个参数调用Array() 函数,数组元素的值0,该元素的索引,也是0,以及对整个数组的引用。

所以就像这样做:

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Array() 返回的数组随后成为.map() 创建的数组的第一个元素,因此在您的[[0, 0, [0]]] 结果中嵌套了额外级别。

关于您的编辑的编辑:当您说 [0].map(String); 时,会使用与 String(a[index], index, a) 相同的三个参数调用 String(),但 String() 函数忽略除第一个参数之外的所有参数,而 Array() 使用所有提供的参数。

【讨论】:

    【解决方案2】:

    首先Array 可以用作创建数组的函数:

    var arr = Array(1, 2, "Hello");
    
    console.log(arr); // [1, 2, "Hello"]

    其次map 将三个参数传递给它的回调:元素、它在数组中的索引和数组本身。

    所以,由于您的数组包含一个元素,因此行:

    [0].map(Array);
    

    相当于:

    [Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])
    

    【讨论】:

      【解决方案3】:

      在您更新问题后。其他答案为您提供有关map 的信息

      要回答为什么数组和字符串不同,请看构造函数

      字符串构造函数接受1个参数String(thing)而数组new Array(element0, element1[, ...[, elementN]])

      【讨论】:

      • 这与.map(Number) 将每个项目转换为数字而不是为每个项目返回类似[3, 2, [4, 1, 3]] 的原因相同。
      • @Xufox 是的,答案在构造函数中 :)
      【解决方案4】:

      这个电话

      [0].map(Array);
      

      给你的结果和你写这样的东西一样:

      [0].map(function (value, index, array) {
          return Array(value, index, array);
      })
      

      Map 函数调用Array 函数,带有三个参数:元素的值、元素的索引和整个数组。对 Array 的调用会返回包含 3 个元素的数组:值(数字 0)、索引(数字 0)、整个数组([0])。

      并且这个新数组被包裹在原始数组中,因为您将原始元素(编号0)映射到新元素(3 个元素的数组)

      注意:您可能习惯于只使用第一个参数,如 in

      array.map(function (a) { return a * a; });
      

      或者只使用两个来获得索引

      array.map(function (item, index) { return "index=" + index + ", value=" + item; });
      

      但您需要记住,map 仍然提供 3 个参数,您只需在回调函数中忽略它们即可。这也是为什么代码像这样的原因:

      [0].map(String);
      

      返回

      ["0"]
      

      这是因为String函数只关心第一个参数而忽略其他传递的参数。 如果你打电话

      String(11, "Some", "other", "ignored", "parameters")
      

      你仍然会得到

      "11"
      

      【讨论】:

        猜你喜欢
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多