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 arguments
d'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' arguments
objet :
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