web-dev-qa-db-fra.com

Méthode de carte Javascript sur un tableau d'éléments de chaîne

J'essaie de comprendre comment implémenter la méthode map (plutôt que d'utiliser une boucle for) pour vérifier une chaîne pour palindromes et renvoyer des valeurs booléennes indiquant si les éléments de tableau mappés inversés sont identiques à ceux du tableau d'origine. Je n'arrive pas à comprendre la syntaxe de la méthode map. Comment faire en sorte que la carte fonctionne sur chaque élément du tableau d'origine? Quelle est la valeur? Voici mon code de travail, qui enregistre uniquement une valeur indéfinie:

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

Voici un lien vers le violon: https://jsfiddle.net/minditorrey/3s6uqxrh/1/

Il y a une question connexe ici:

Paramètres de rappel de la méthode de mappage avec un tableau Javascript

mais cela ne répond pas à ma confusion quant à la syntaxe de la méthode map lorsque je l'utilise pour effectuer une fonction sur un tableau de chaînes.

7
Mindi Torrey

La méthode map va littéralement "mapper" un appel de fonction sur chaque élément du tableau. Il s'agit d'un exemple simple d'augmentation de 1 de la valeur de chaque entier d'un tableau:

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

// returns [2,3,4]

Dans votre cas, vous essayez d'utiliser map pour accepter ou rejeter une chaîne s'il s'agit d'un palindrome. Par conséquent, une implémentation simple pourrait être:

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

// returns [true, true, false]

Je ne suis pas sûr à 100% des raisons pour lesquelles vous avez utilisé map, car si vous essayez simplement de filtrer le tableau et de supprimer les chaînes qui ne sont pas des palindromes, vous devriez probablement utiliser la méthode filter à la place, qui fonctionne de la même manière, mais enlèverait tout ce qui retourne faux:

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

// returns ['mum', dad']

Dans votre cas, vous divisez d’abord une chaîne pour obtenir votre tableau de caractères; vous pouvez également vouloir mettre cette chaîne en minuscule et supprimer la ponctuation, ainsi une implémentation pourrait être:

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']

Comme indiqué dans l'un des commentaires relatifs à votre question, vous devez vous assurer que vous avez une variable return de votre fonction si vous utilisez une fonction distincte pour effectuer la vérification. Voici à quoi devrait ressembler votre fonction:

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;
}

Et vous l'appelleriez en utilisant:

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

La fonction map en javascript (et pratiquement dans n’importe quelle langue) est une très petite fonction qui vous permet d’appeler une fonction sur chacun des éléments d’une liste, et de modifier ainsi la liste elle-même . La fonction (anonyme) que vous Passer comme argument accepte un argument lui-même, qui est rempli par un élément de la liste sur laquelle il travaille, chaque fois qu'il est appelé.

Ainsi, pour une liste [1,2,3,4], la fonction function(item) { return item + 1 } vous donnerait une liste de [2,3,4,5] pour un résultat. La fonction que vous avez passée à $.map() est exécutée sur chaque élément de la liste et modifie ainsi la liste.

Donc, pour votre code: dans la fonction que vous passez en argument à $.map(), vous retournez si l'ancien et le nouveau tableau sont égaux (ce qui est false en fait). Donc, puisque vous renvoyez une valeur booléenne, vous obtiendrez une liste de bools . Ce que je pense que vous voulez faire est d'extraire le newArray == myArray de la fonction que vous passez à $.map(), et placez-le après votre appel $.map() . Ensuite, dans la fonction que vous passez à $.map(), renvoyez l'élément que vous êtes en train de scinder et ainsi de suite, afin que votre newArray soit un tableau de chaînes comme myArray.

0
Glubus

newArray doit inclure une version inversée des éléments theall dans myArray. Après cela, newArray doit être inversé et joint à l'espace afin d'obtenir la version inversée de la chaîne d'entrée.

Voici le code:

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"));
0
Cem Ekici

Merci à tous pour votre contribution. C'est le code que j'ai fini avec. J'ai corrigé les problèmes de portée dans le message d'origine. Mon principal problème était de comprendre la syntaxe de la méthode map. En particulier, je ne pouvais pas comprendre, à partir d'autres ressources en ligne, comment déterminer la valeur de la fonction de rappel. Donc, avec beaucoup d’aide, j'ai placé la méthode map à l’intérieur de palindromeChecker et effectué tous les travaux sur le tableau dans la fonction 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
Mindi Torrey

essayez quelque chose comme ça:

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

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

En dehors de quelques erreurs mineures dans votre code, telles que des problèmes de portée (vous faites référence à "newArray" et "myArray" en dehors de la fonction dans laquelle ils ont été définis, et donc à un "non défini").

Le problème principal que vous avez eu est que vous avez traité le tableau ENTIER dans la fonction map, alors que tout le concept consiste à diviser les éléments en un seul élément (puis la fonction collecte tout dans un tableau pour vous).

J'ai utilisé la fonction "Filtre" dans mon exemple, car il fonctionne de manière similaire et j'ai l'impression qu'il fait ce que vous voulez, mais vous pouvez changer le "filtre" en "carte" et voir ce qui se passe.

À votre santé :)

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
DougieHauser

Map est une fonction d'ordre supérieur disponible dans ES5. Je pense que votre newArray contiendra un tableau de valeurs booléennes.

Essentiellement, map va parcourir toutes les valeurs de votre tableau et appliquer la fonction. La valeur de retour sera la nouvelle valeur du tableau. Vous pouvez également utiliser map, enregistrer les informations dont vous avez besoin ailleurs et ignorer le résultat.

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