Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串元素数组上的Javascript映射方法_Javascript_Arrays_Dictionary - Fatal编程技术网

字符串元素数组上的Javascript映射方法

字符串元素数组上的Javascript映射方法,javascript,arrays,dictionary,Javascript,Arrays,Dictionary,我试图理解如何实现map方法(而不是使用for循环)来检查字符串的回文,并返回布尔值以确定映射的数组元素是否与原始数组元素相同。我似乎无法理解map方法的语法。如何使映射在原始数组中的每个元素上运行?价值是什么?这是我的工作代码,它只记录未定义的值: function palindromeChecker(string) { var myString = string.toLowerCase(); var myArray = myString.split(" "); var

我试图理解如何实现map方法(而不是使用for循环)来检查字符串的回文,并返回布尔值以确定映射的数组元素是否与原始数组元素相同。我似乎无法理解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"));
以下是小提琴的链接:

这里有一个相关的问题:


但这并不能解决我在使用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
将是一个字符串数组,如
myArray

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"));

除了代码中的一些小错误,例如范围问题(您在定义它们的函数之外引用了“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方法处理带有字符串元素的数组。非常感谢你仔细的回答!这只返回一个值