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

时间:2016-01-21 13:49:35

标签: javascript arrays dictionary

我试图理解如何实现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方法语法的困惑。

8 个答案:

答案 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;
    })