web-dev-qa-db-fra.com

Réduire le tableau en une seule chaîne

Je voudrais utiliser la fonction reduce au lieu de faire ceci:

var result = '';
authors.forEach(
    function(author) {
        result += author.name + ', ';
    }
);
console.log(result);

Donc dans le tableau authors il y a plusieurs noms. Maintenant, je veux construire une chaîne avec ces noms, séparés par une virgule (sauf le dernier).

var result = authors.reduce(function (author, index) {
    return author + ' ';
}, '');
console.log(result);
23
user3142695

Une vague de réponses vient d'arriver et en voici une de plus!

La première option utilise la méthode native js join qui élimine le besoin de réduire. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join

var authors = ['some author', 'another author', 'last author'];
var authorString = authors.join(",");
console.log(authorString);

[~ # ~] important [~ # ~] - si votre tableau contient des objets, alors vous voudrez peut-être le mapper avant de rejoindre:

var authors = [{name: 'some author'},{name: 'another author'},{name: 'last author'}]
var authorString = authors.map(function(author){
    return author.name;
}).join(",");
console.log(authorString);

ou, si vous êtes vraiment passionné par l'utilisation de réduire, assurez-vous simplement d'utiliser la valeur précédente, la valeur actuelle et l'index lors du passage du rappel. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

var authorString = authors.reduce(function(prevVal,currVal,idx){
    return idx == 0 ? currVal : prevVal + ', ' + currVal;
}, '')
console.log(authorString);

[~ # ~] important [~ # ~] - encore une fois si votre tableau contient des objets, vous voudrez vous assurer que vous utilisez la propriété 'name ":

var authors = [{name: 'some author'},{name: 'another author'},{name: 'last author'}];
var authorString = authors.reduce(function(prevVal,currVal,idx){
    return idx == 0 ? currVal.name : prevVal + ', ' + currVal.name;
}, '')
console.log(authorString);
45
abigwonderful

C'est donc un objet. Mappons d'abord les noms, puis:

var result = authors.map(function( author ) {
    return author.name;
}).join(', ');
15
Shilly

Vous réinventez join ()

var authors = ["a","b","c"];
var str = authors.join(", ");
console.log(str);

si vous voulez utiliser réduire, ajoutez un si cocher

var authors = ["a","b","c"];

var result = authors.reduce(function (author, val, index) {
    var comma = author.length ? ", " : "";
    return author + comma + val;
}, '');
console.log(result);

Depuis que j'ai raté la partie cartographie pour rendre les gens heureux ...

var authors = [{
  name: "a"
}, {
  name: "b"
}, {
  name: "c"
}];

var res = authors.map( function(val) { return val.name; }).join(", ");
console.log(res);

OR

var authors = [{
  name: "a"
}, {
  name: "b"
}, {
  name: "c"
}];
var result = authors.reduce(function(author, val, index) {
  var comma = author.length ? ", " : "";
  return author + comma + val.name;
}, '');
console.log(result);
2
epascarello

Je suis tombé là-dessus aussi. La plupart de ces réponses ne tiennent pas compte du fait que vous voulez que l'auteur s nom, ce qui signifie que vous avez un tableau d'objets.

Une solution en ligne:

authors.reduce((prev, curr) => [...prev, curr.name], []).join(', ');
0
Ronjark