Définissez une fonction, myJoin
, qui accepte jusqu'à deux arguments:
array
séparateur
(chaîne, facultatif) myJoin
doit retourner une chaîne avec tous les éléments du tableau réunis. Le séparateur doit séparer les éléments joints:
function myJoin (array, separator) { let newString = ""; if (separator === undefined) { separator === ","; } for (let i = 0; i < array.length; i++) { newString += array[i] + separator; } return newString; }
Si le séparateur n'est pas défini, utilisez ','
comme séparateur par défaut.
function myJoin (array, separator) { let newString = ""; if (separator = undefined) { separator === ","; } else { for (let i = 0; i < array.length; i++) { newString = i + separator; } } newString = array.toString(); return newString; } console.log(myJoin(['a', 'b', 'c'], '+'));
Si des éléments du tableau sont indéfinis
ou null
, ils doivent être remplacés par une chaîne vide dans la chaîne renvoyée. P >
myJoin(['hello', undefined, 'world'], '-'); // => "hello--world"
Je ne peux pas utiliser le Méthode join
.
Lien vers le codepen pour le test
Jusqu'à présent, j'ai essayé:
myJoin(['Peter', 'Paul', 'Mary']); // => "Peter,Paul,Mary"
^ Cela ne combine pas les éléments de la chaîne avec le séparateur, et renvoie en fait a, b, c
deux fois. Une idée pourquoi?
MODIFIER : Première mise à jour du code après les suggestions de @Jonas Wilms:
myJoin(['a', 'b', 'c'], '+'); // => "a+b+c"
Cela semble être fonctionne dans ma console VS Code mais pas dans CodePen.
6 Réponses :
Quelques conseils:
Ne confondez pas les opérateurs d'affectation ( =
) et de comparaison ( ===
). if (a = b)
est une erreur dans 99% des cas.
array.toString ()
appelle array.join ()
en interne, je considérerais cela comme de la triche, aussi je ne suis pas sûr de ce que vous voulez réaliser avec ça (je veux dire que newString
devrait déjà contenir le résultat souhaité si vous faites la boucle correctement, n'est-ce pas?)
i
est l'index dans votre tableau
pour obtenir la valeur à cette position, utilisez array [i] < / code>.
Je ne pense pas que votre boucle devrait être dans la branche else {
, je ne pense pas que vous ayez besoin de cet else
du tout (comme vous veulent toujours rejoindre le tableau en faisant une boucle dessus).
avec newString =
vous réaffectez newString
et perdez la valeur précédente, vous voudrez peut-être utiliser newString + =
pour y ajouter une valeur.
Veuillez consulter ma dernière modification - j'ai essayé de développer autant de vos conseils que possible.
@ happyHands31 vous ajoutez également un séparateur au dernier élément, ce qui donne "a, b, c," ...
J'aurais donc besoin de supprimer le dernier élément du tableau que je retourne? Vous utilisez .pop ()
ou .slice ()
?
try
function myJoin(array, separator=',') { return array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '') } console.log( myJoin(['a', 'b', 'c'], '+') ); console.log( myJoin(['Peter', 'Paul', 'Mary']) ); console.log( myJoin(['hello', undefined, 'world'], '-') );
array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '')
Nous utilisons ici des fonctionnalités js standard: fonctions fléchées , tableau réduire et opérateur ternaire . Si i> 0
(pas vrai uniquement pour le premier élément), nous ajoutons un séparateur à la chaîne de sortie s
. Si x
est indéfini ou nul , nous ajoutons à s
une chaîne vide - ou valeur x
dans les autres cas.
Vous pouvez utiliser Array .reduce ()
pour rejoindre votre tableau.
let arr = ['a', 'b', undefined, 'c', 'd', null, 'e']; myJoin = (arr, separator = ',') => arr.reduce((acc, val, i) => acc + ([undefined, null].indexOf(val) >= 0 ? '' : val) + (i < arr.length - 1 ? separator : ''), ""); console.log('myJoin(arr): ', myJoin(arr)); console.log('myJoin(arr, "+"): ', myJoin(arr, '+')); console.log('arr.join("+"): ', arr.join('+'));
J'espère que cela vous aidera,
Utiliser un tableau pour vérifier si une valeur est soit null
ou non défini
est un peu exagéré à mon humble avis. val == null
est très bien car undefined
et null
sont vaguement égaux l'un à l'autre.
@customcommander Ouais, je sais, juste la force de l'habitude maintenant je suppose: /
Utilisez map
et forEach
avec une chaîne de modèle comme celle-ci:
function myJoin(arr, sep) { sep = sep || ","; arr = arr.map(function(e) { return [undefined, null].includes(e) ? "" : e; }); var result = ""; arr.forEach(function(e, i) { result += (i ? sep : "") + e; }); return result; } console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));
Syntaxe ES5:
function myJoin(arr, sep = ",") { arr = arr.map(e => [undefined, null].includes(e) ? "" : e); var result = ""; arr.forEach((e, i) => result += `${i ? sep : ""}${e}`); return result; } console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));
N'utilisez pas la méthode de tableau .join intégrée dans votre réponse.
Correction du problème @Keith.
function myJoin(array, separator=',') { let str = ''; for (let i = 0; i < array.length; i++) { if (array[i] !== null && array[i] !== undefined) str += array[i]; if (i < array.length - 1) str += separator; } return str; } console.log(myJoin(['a','b','c'])); console.log(myJoin(['a','b','c'], '+')); console.log(myJoin(['a',null,'c'], '-')); console.log(myJoin(['a','b',undefined], '.'));
Désolé mais je ne comprends pas l'utilisation de ... params
comme paramètre. Pouvez-vous le réécrire avec les paramètres array
, separator
comme dans mon code?
@ HappyHands31 ... params prend tous les paramètres et forme un tableau avec eux. Mais maintenant, c'est encore plus facile à comprendre avec les deux paramètres
Merci - ouais maintenant ça a du sens, et ça marche. Donc, avec vos deux instructions if
, il alterne entre l'ajout de array [i]
et de separator
à la str
? Les instructions if
alternent-elles ce qu'elles ajoutent alors par défaut?
Pouvez-vous également expliquer separator = ','
comme deuxième paramètre initial - que se passe-t-il si l'utilisateur saisit le séparateur comme +
ou -
?
Le premier if
vérifie si votre valeur mérite d'être ajoutée à la chaîne (non nulle et non indéfinie). Le second if
vérifie que si on est au dernier élément du tableau, on ne met pas le séparateur (évitez d'avoir le séparateur à la fin)
separator = ',' signifie "valeur par défaut". Ainsi, si vous ne donnez qu'un seul paramètre, le séparateur sera mis à ','. Si vous donnez 2 paramètres, le ',' sera remplacé par votre 2ème paramètre
Je vois, oui je comprends ce qu'ils vérifient - je ne savais tout simplement pas que les instructions if
consécutives alternent ce qu'elles ajoutent à une nouvelle chaîne. Intéressant.
continuons cette discussion dans le chat .
Utilisez la syntaxe par défaut pour définir le séparateur ||
Un forEach
prenant en valeur
, index
, tableau
Tester le dernier élément.
function myJoin (array, separator) { let newString = ""; separator = separator||','; array.forEach((a,i,arr) => { newString += `${a}${(i < arr.length-1) ? separator : ''}`; }); return newString; } console.log(myJoin(['a', 'b', 'c'], '+')); console.log(myJoin(['a', 'b', 'c'])); console.log(myJoin(['a', 'b', 'c'], '-'));
Pourquoi un morceau de code fonctionnel obtiendrait-il un vote négatif sans commentaire?
Pouvez-vous expliquer votre code?
La boucle
for
ne doit pas être dans la clauseelse
, et la comparaison dans le testif
doit être==
pas=
(=
est pour affectation ).Bien sûr, j'essaie de dire, si le séparateur est défini, parcourez le tableau pour créer un
. Puis transformez
newString
avec les éléments du tableau (i
) + le séparateurnewString
en une chaîne et renvoyez-la.Le code
if (separator = undefined)
fait une assignation du séparateur de variable à la valeurundefined
, pas une comparaison comme vous vous attendez.