3
votes

Transformez le tableau en chaîne, chaîne séparée avec séparateur - JavaScript

Définissez une fonction, myJoin , qui accepte jusqu'à deux arguments:

  1. array
  2. 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.


4 commentaires

Pouvez-vous expliquer votre code?


La boucle for ne doit pas être dans la clause else , et la comparaison dans le test if 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 newString avec les éléments du tableau ( i ) + le séparateur . Puis transformez newString en une chaîne et renvoyez-la.


Le code if (separator = undefined) fait une assignation du séparateur de variable à la valeur undefined , pas une comparaison comme vous vous attendez.


6 Réponses :


2
votes

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.


3 commentaires

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 () ?



6
votes

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.


0 commentaires

1
votes

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,


2 commentaires

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: /



2
votes

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'], "-"));


2 commentaires

N'utilisez pas la méthode de tableau .join intégrée dans votre réponse.


Correction du problème @Keith.



2
votes

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], '.'));


8 commentaires

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 .



2
votes

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'], '-'));


1 commentaires

Pourquoi un morceau de code fonctionnel obtiendrait-il un vote négatif sans commentaire?