JavaScript数组中的字符串元素上使用map方法

19
我试图理解如何实现map方法(而不是使用for循环)来检查字符串是否为回文,并返回布尔值以指示反转的映射数组元素是否与原始数组元素相同。我似乎无法理解map方法的语法。我如何让map方法作用于原始数组中的每个元素?值是什么?这是我的代码,但只记录了未定义的值:
function palindromeChecker(string) {
    var myString = string.toLowerCase();
    var myArray = myString.split(" ");
    var newArray = myArray.map(function (item) {
        item.split("").reverse().join("");
        return newArray === myArray;
    });
}

console.log(palindromeChecker("What pop did dad Drink today"));

这里是一个指向JSFiddle的链接:https://jsfiddle.net/minditorrey/3s6uqxrh/1/

这里还有一个相关问题:

Javascript array map method callback parameters

但它并没有解答我在使用map方法对字符串数组执行函数时遇到的语法困惑。


3
你得到 undefined 是因为你没有从 palindromeChecker 返回任何东西 - 而不是与 map() 有关。 - Rhumborl
你是在尝试判断句子中的单词是否为回文,还是整个句子都是回文。似乎奇怪你会首先使用map。而且在你的fiddle中,你正在尝试记录不在全局范围内的变量的全局范围。 - epascarello
谢谢,epascarelgo。我同意使用map不是做这件事的理想方式,但我仍在努力弄清楚如何做到这一点,以更好地了解map方法如何与包含字符串元素的数组一起使用。感谢您指出作用域问题。我在编码方面处于相当基础的水平。 - Mindi Torrey
8个回答

17

map方法会将一个函数映射到数组中的每个元素上,以将数组中每个整数增加1为例:

var items = [1,2,3];
items.map(function(item) { 
  return item + 1;
});

// returns [2,3,4]

在您的情况下,您想使用map来接受或拒绝一个字符串,如果它是回文的话,那么一个简单的实现可能是:

var items = ['mum', 'dad', 'brother'];
items.map(function(item) {
  return item.split('').reverse().join('') === item;
});

// returns [true, true, false]

我不确定你使用 map 的原因是什么,因为如果你只是想筛选数组并删除不是回文的字符串,你应该使用 filter 方法,它的工作方式相同,但会删除返回 false 的任何元素:

var items = ['mum', 'dad', 'brother'];
items.filter(function(item) {
  return item.split('').reverse().join('') === item;
});

// returns ['mum', dad']

在您的情况下,您首先需要分割字符串以获取字符数组;您可能还希望将该字符串转换为小写并删除标点符号,因此一个实现可能是:

var string = 'I live at home with my Mum, my Dad and my Brother!';
var items = string.toLowerCase().replace(/[^a-z0-9-\s]+/, '').split(' ');
items.filter(function(item) {
  return item.split('').reverse().join('') === item;
});

// returns ['i', 'mum', dad']

如您在问题的评论中提到的一样,如果您正在使用单独的函数来执行检查,则需要确保从该函数中return一个值,因此您的函数应该如下所示:

function checkPalindromes(string) {
  var items = string.toLowerCase().replace(/[^a-z0-9-\s]+/, '').split(' ');
  items.filter(function(item) {
    return item.split('').reverse().join('') === item;
  });

  return items;
}

你可以使用以下方式调用它:

checkPalindromes('I live at home with my Mum, my Dad and my Brother!'); // ['i', 'mum', 'dad']

你仍然没有理解为什么该方法返回undefined。 - epascarello
2
谢谢,@toomanyredirects。这真的很有帮助。我同意过滤函数对大多数情况更实用,但我真的只是想学习如何使用具有字符串元素的数组的映射方法。非常感谢您仔细的回答! - Mindi Torrey

9

可以尝试以下做法:

let str = 'hello';
let tab = [...str];

tab.map((x)=> {
    console.log("|"+x+"|");
    return x;
})

1
新数组应包括myArray中所有项目的反向版本。之后,将反向的newArray再次反转并用空格连接以获取输入字符串的反向版本。
以下是代码:
function palindromeChecker(string) {
  var myString = string.toLowerCase();
  var myArray = myString.split(" ");
  var newArray = myArray.map(function (item) {
        return item.split("").reverse().join("");
    });
  console.log(newArray);
  return newArray.reverse().join(" ") === string;
}

console.log(palindromeChecker("dad did what"));

这个函数仅返回一个值,即将原始字符串与反转后的字符串进行比较。我正在尝试返回布尔值,将数组中的每个元素(即每个单词)与其反转后的单词进行比较,以确定每个单词是否为回文。因此,返回的布尔值的数量等于字符串中的单词数。 - Mindi Torrey

1
JavaScript的map方法可通过使用split()函数处理字符串元素的数组。
let str = 'hello';
      
    str.split('').map((x)=> {
        console.log("|"+x+"|");
        return x;
    })

0

Map是ES5中可用的高阶函数。我认为你的newArray将包含一个布尔值数组。

实质上,map将迭代数组中的每个值并应用该函数。返回值将是数组中的新值。您还可以使用map并将所需信息保存在其他地方,当然也可以忽略结果。

var arr = [1,2,3,4];
var newArray = arr.map(function(i) {
  return i * 2;
});
//newArray = [2,4,6,8]

我尝试使用字符串数组,但出现了一些问题:var a = ["a","b","vvv"]; a.map((key)=>{return {key:0}}); ,我得到的数组中所有的键都是 key - Pini Cheyni

0
除了您代码中的一些小错误,例如作用域问题(您在定义它们的函数之外引用“newArray”和“myArray”,因此得到“undefined”)...
您遇到的主要问题是在map函数中处理整个数组,而整个概念是将事物分解为单个元素(然后函数会将所有内容收集回一个数组)。
我在示例中使用了“filter”函数,因为它的工作方式类似,我觉得它可以实现您想要的功能,但您可以将“filter”更改为“map”并查看发生了什么。
干杯 :)
HTML:
<body>

<p id="bla">
BLA
</p>

<p id="bla2">
BLA2
</p>

</body>

Javascript:

function palindromeChecker(string) {
  var myString = string.toLowerCase();
  var myArray = myString.split(" ");
  var newArray = myArray.filter(function (item) {
    var reversedItem = item.split('').reverse().join('');
    return  item == reversedItem;
});

document.getElementById("bla").innerHTML = myArray;
document.getElementById("bla2").innerHTML = newArray;

}

palindromeChecker("What pop did dad Drink today");

0

谢谢大家的参与。这是我最终得出的代码。我已经解决了原帖中的作用域问题。我的主要问题是理解map方法的语法。特别是,我无法从其他在线资源中理解如何确定回调函数中的值。因此,在上面的帮助下,我将map方法放置在palindromeChecker内部,并在map函数内完成了所有数组工作。

var palindromeChecker = function(string) {
var newString = string.toLowerCase().split(' ');
newString.map(function(item) {
  console.log(item.split('').reverse().join('') === item);
  });
}; 

palindromeChecker("What pop did dad drink today");

//Returns false, true, true, true, false, false

0
JavaScript中的映射函数(在任何语言中都是如此)是一个非常棒的小函数,允许您在列表中调用一个函数,并因此更改列表本身。
作为参数传递的(匿名)函数本身接受一个参数,该参数由其正在处理的列表项填充,每次调用它时。
所以对于一个列表[1,2,3,4],函数function(item) { return item + 1 }将给您一个结果为[2,3,4,5]的列表。您传递给$.map()的函数将运行在列表的每个元素上,并因此更改列表。
所以针对你的代码:在你作为参数传递给$.map()的函数中,你返回的是旧数组和新数组是否相等(顺便说一下,这是错误的)。因此,由于你返回了一个布尔值,你最终得到的列表将是一个布尔值列表。 我认为你想要做的是,从你传递给$.map()的函数中提取出newArray == myArray,并将其放在$.map()调用之后。 然后,在你传递给$.map()的函数内部,返回你正在拆分和处理的项,这样你的newArray将是一个字符串数组,就像myArray一样。

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