我有以下简单的功能:
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"
。
我无法弄清楚为什么它不起作用,只是将我的输入返回给我未经修改?
答案 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
。