我试图理解如何实现map方法(而不是使用for循环)来检查字符串的palindromes并返回布尔值,以确定映射的数组元素是否与原始数组元素相同。我似乎无法理解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"));
以下是小提琴的链接: https://jsfiddle.net/minditorrey/3s6uqxrh/1/
这里有一个相关的问题:
Javascript array map method callback parameters
但是当使用它来对字符串数组执行函数时,它并没有回答我对map方法语法的困惑。
答案 0 :(得分:10)
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]
我不能100%确定您使用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']
答案 1 :(得分:0)
Map是ES5中提供的高阶函数。我认为你的newArray
将包含一个布尔值数组。
实质上,map将迭代数组中的每个值并应用该函数。返回值将是数组中的新值。您也可以使用地图并在其他地方保存您需要的信息,当然也会忽略结果。
var arr = [1,2,3,4];
var newArray = arr.map(function(i) {
return i * 2;
});
//newArray = [2,4,6,8]
答案 2 :(得分:0)
javascript(几乎用任何语言)中的map函数是一个很棒的小函数,它允许你在列表上的每个项目上调用一个函数,从而改变列表本身。 您作为参数传递的(匿名)函数接受一个参数本身,每次调用它时,它都由它正在处理的列表项填充。
对于列表[1,2,3,4]
,函数
function(item) { return item + 1 }
会为您提供[2,3,4,5]
的结果列表。您传递给$.map()
的函数将在列表的每个元素上运行,从而更改列表。
所以对于你的代码:在你作为参数传递给$.map()
的函数中,你将返回旧数组和新数组是否相等(这是假btw)。因此,既然您返回了一个布尔值,那么您最终得到的列表就是一个bool列表。
我认为您想要做的是从您传递给newArray == myArray
的功能中提取$.map()
,并将其放在$.map()
来电之后。
然后在您传递给$.map()
的函数内部,返回您要拆分的项目以及诸如此类的内容,因此您的newArray
将是一个字符串数组,如myArray
。< / p>
答案 3 :(得分:0)
newArray应该包含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"));
答案 4 :(得分:0)
除了代码中的一些小错误,例如范围问题(你在其定义的函数之外引用“newArray”和“myArray”,因此,得到“undefined”)..
你遇到的主要问题是你在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");
答案 5 :(得分: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
答案 6 :(得分:0)
尝试这样的事情:
let str = 'hello';
let tab = [...str];
tab.map((x)=> {
console.log("|"+x+"|");
return x;
})
答案 7 :(得分:0)
使用split()函数对字符串元素数组进行JavaScript映射的方法。
let str = 'hello';
str.split('').map((x)=> {
console.log("|"+x+"|");
return x;
})