GOOGLE ADS

mercredi 4 mai 2022

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais essentiellement je voudrais faire ceci:

var flatten = function() {
var flattened = arguments.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};
var arr = [[1,2,3], 4, 5, [6, 7]];
console.log(flatten(arr)) // => [1,2,3,4,5,6,7]

J'obtiens l'erreur suivante :

TypeError: arguments.reduce is not a function

Je comprends que l'erreur ci-dessus est due au fait que les arguments ne ressemblent qu'à un tableau, il n'a donc pas toutes les capacités d'un vrai tableau. Il y a donc ce qui suit, mais je me demande s'il y a quelque chose d'encore plus propre:

var flatten = function() {
var flattened = [].reduce.call(arguments, function(acc, elem) { return acc.concat(elem) });
return flattened;
};

Un bon moyen de réécrire.flatten en utilisant.reduce()?

REMARQUE: je sais qu'il existe de nombreuses autres façons d'aplatir des tableaux en javascript, mais ce que je me demandais ici, c'est comment le faire avec des arguments spécifiques.


Solution du problème

Convertissez argumentsd'abord l'objet en tableau :

var flatten = function() {
var args = Array.prototype.slice.call(arguments);
var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Ou utilisez directement les méthodes de tableau sur l' argumentsobjet :

var flatten = function() {
var flattened = Array.prototype.reduce.call(arguments, function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Dans ES6, vous pouvez utiliser Array.from()pour convertir n'importe quel objet itérable ou de type tableau en un tableau réel :

var flatten = function() {
var args = Array.from(arguments);
var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Mise à jour en 2021 à l'aide des fonctionnalités de langage moderne :

function flatten(...args) {
return args.flat();
}

Et, vous pouvez passer une profondeur à .flat(n)(la valeur par défaut est 1) si vous souhaitez aplatir à un niveau plus profond qu'un seul niveau vers le bas.

Bien que, puisque nous avons maintenant ces fonctionnalités plus modernes intégrées dans le langage, vous pouvez probablement les utiliser plus directement plutôt que de les transmettre à une fonction pour y travailler, mais nous devrions voir des cas d'utilisation particuliers pour faire des suggestions pour inline façons de résoudre votre problème plutôt que d'utiliser cette fonction.

Pour votre information, il existe de nombreuses façons d'aplatir un tableau :

Fusionner/aplatir un tableau de tableaux

Comment aplatir un tableau imbriqué en javascript?

Aplatir les tableaux multidimensionnels en JavaScript

Méthode Array.prototype.flat()

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...