字符串元素数组上的Javascript映射方法
我试图理解如何实现map方法(而不是使用for循环)来检查字符串的回文,并返回布尔值以确定映射的数组元素是否与原始数组元素相同。我似乎无法理解map方法的语法。如何使映射在原始数组中的每个元素上运行?价值是什么?这是我的工作代码,它只记录未定义的值:字符串元素数组上的Javascript映射方法,javascript,arrays,dictionary,Javascript,Arrays,Dictionary,我试图理解如何实现map方法(而不是使用for循环)来检查字符串的回文,并返回布尔值以确定映射的数组元素是否与原始数组元素相同。我似乎无法理解map方法的语法。如何使映射在原始数组中的每个元素上运行?价值是什么?这是我的工作代码,它只记录未定义的值: function palindromeChecker(string) { var myString = string.toLowerCase(); var myArray = myString.split(" "); var
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"));
以下是小提琴的链接:
这里有一个相关的问题:
但这并不能解决我在使用map方法对字符串数组执行函数时对map方法语法的困惑。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]
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']
我不能100%确定您使用map
的原因,因为如果您只是尝试筛选数组并删除非回文的字符串,您可能应该使用filter
方法,其工作方式相同,但会删除任何返回false的字符串:
var items = ['mum', 'dad', 'brother'];
items.filter(function(item) {
return item.split('').reverse().join('') === item;
});
// returns ['mum', dad']
在本例中,首先拆分字符串以获得字符数组;您可能还希望将该字符串改为小写并删除标点符号,因此实现可能是:
var items = ['mum', 'dad', 'brother'];
items.map(function(item) {
return item.split('').reverse().join('') === item;
});
// returns [true, true, false]
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']
正如在您的问题的一条评论中提到的,如果您使用单独的函数来执行检查,您需要确保从函数中返回一个值,因此函数的外观如下所示:
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']
是ES5中可用的高阶函数。我认为您的newArray
将包含一个布尔值数组
本质上,map将迭代数组中的每个值并应用函数。返回值将是数组中的新值。您也可以使用map并将所需信息保存到其他地方,当然也可以忽略结果
var arr = [1,2,3,4];
var newArray = arr.map(function(i) {
return i * 2;
});
//newArray = [2,4,6,8]
javascript中的map函数(几乎在任何语言中)都是一个非常好的小函数,它允许您对列表中的每个项调用函数,从而更改列表本身。
作为参数传递的(匿名)函数每次调用时都会接受一个参数本身,该参数由它所处理的列表中的一项填充
因此,对于列表[1,2,3,4]
,函数
函数(项){return item+1}
将为您提供一个结果的[2,3,4,5]
列表。传递给$.map()
的函数将在列表的每个元素上运行,从而更改列表
因此对于您的代码:在作为参数传递给$.map()
的函数中,您将返回新旧数组是否相等(顺便说一句,这是false)。因此,由于返回的是布尔值,因此最终得到的列表是布尔值列表。
我认为您要做的是从传递给$.map()
的函数中提取newArray==myArray
,并将其放在调用$.map()
之后。
然后在传递给$.map()
的函数中,返回要拆分的项等等,这样newArray
将是一个字符串数组,如myArraynewArray应该包含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"));
除了代码中的一些小错误,例如范围问题(您在定义它们的函数之外引用了“newArray”和“myArray”,因此得到了“undefined”)
您遇到的主要问题是,您在map函数中处理了整个数组,而整个概念是将内容分解为单个元素(然后函数将所有内容收集回数组)
我在我的示例中使用了“filter”函数,因为它以类似的方式工作,我觉得它可以满足您的需要,但是您可以将“filter”更改为“map”,然后查看结果
干杯:)
HTML:
谢谢大家的意见。这就是我最终得到的代码。我在最初的帖子中修复了范围问题。我的主要问题是理解map方法的语法。特别是,我无法从其他在线资源了解如何确定回调函数中的值。因此,在上面的帮助下,我将map方法放置在回文检查器中,并完成了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
试着这样做:
let str = 'hello';
let tab = [...str];
tab.map((x)=> {
console.log("|"+x+"|");
return x;
})
使用split()函数在字符串元素数组上映射Javascript方法。
let str = 'hello';
str.split('').map((x)=> {
console.log("|"+x+"|");
return x;
})
您得到的是未定义的,
,因为您没有从回文检查器返回任何内容
-与映射()无关。
您是否试图查看句子中的单词是回文还是整个句子都是回文。看起来很奇怪,你会先用地图。在你的小提琴中,你试图记录全局范围内不在全局范围内的变量。谢谢,epascarelgo。我同意map不是实现这一点的理想方法,但我正试图弄清楚如何做到这一点,以便更好地理解map方法如何处理带有字符串元素的数组。感谢您注意到有关范围的问题。我在编码方面已经达到了相当基本的水平。你仍然不知道为什么该方法返回undefined。谢谢,@toomanyredirects。这真的很有帮助。我同意filter函数在大多数情况下更实用,但我只是想学习如何使用map方法处理带有字符串元素的数组。非常感谢你仔细的回答!这只返回一个值