为什么map方法无法改变数组?

时间:2017-02-02 13:09:36

标签: javascript

我有以下简单的功能:

function shiftCase2(string) {
    temp = string.split('');
    temp.map(function(x) {
        if (x == x.toUpperCase()) {
            x = x.toLowerCase();
        }
        if (x == x.toLowerCase()) {
            x = x.toUpperCase();
        }
    })
    temp = temp.join("");
    console.log(temp);
}

它应该遍历数组的每个元素,如果字符是大写,则将其更改为小写,反之亦然。例如,shiftCase2("TEST string to USE");应该会返回"test STRING TO use"

我无法弄清楚为什么它不起作用,只是将我的输入返回给我未经修改?

4 个答案:

答案 0 :(得分:5)

.map()是一个所谓的纯函数。这意味着它不会修改您的输入,而是会生成新的输出。

你必须这样做:

temp = temp.map(function(x) {
    if (x == x.toUpperCase()) {
        return x.toLowerCase();
    }
    if (x == x.toLowerCase()) {
        return x.toUpperCase();
    }
})

我建议您查看docs to learn how it works

答案 1 :(得分:0)

.map()创建一个新数组。传递给.map()的函数也必须返回一个新值。这就是它的完成方式:

temp = temp.map(function(x) {
    if (x == x.toUpperCase()) {
        x = x.toLowerCase();
    }
    if (x == x.toLowerCase()) {
        x = x.toUpperCase();
    }
    return x;
}

答案 2 :(得分:0)

  

Array.prototype.map()创建一个包含调用结果的新数组   在此数组中的每个元素上提供的函数。 Source

基本上.map()不会按设计修改原始输入。

答案 3 :(得分:-1)

<?php require_once('OpenGraph.php'); function get_youtube_title($video_id){ $url = "http://www.youtube.com/watch?v=".$video_id; $graph = OpenGraph::fetch($url); // You can get title from array return $graph->title; } 方法不会修改数组,而是返回一个新数组。但是,.map()方法会改变数组,这正是您所期望的。

代码清晰度的粉丝和&#34;功能编程&#34;我会说使用.forEach()方法更好地理解您的代码会更好,我一般都同意。但是,如果性能是大型阵列的主要关注点,.map()实际上更快。有关性能比较,请参阅this link。在这种情况下,最好坚持forEach

祝你好运!