Si j'ai 2 tableaux ( propriétés
et données
):
statistics = [{ name: 'Luke Skywalker', height: 123, weight: 112, zone: 'B' }, { name: 'Jawa', height: 12, weight: 8, zone: 'B' }, { name: 'Hutt', height: 200, weight: 999, zone: 'C' } ];
et que je souhaite créer un tableau d'objets ( statistiques ):
properties = [name, height, weight, zone]; data = [ ['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C'] ];
Habituellement, j'utiliserais simplement une carte sur données []
, créer un temp , et poussez-le sur
statistics[
.
Mais puisque je sais que toutes les autres entrées dans data
ont les mêmes dimensions et types de données . Je sais également qu'il existe un mappage un à un entre les propriétés
et les données
. Existe-t-il une fonction intégrée dans javascript qui génère un tableau d'objets avec un mappage un-à-un? Quelque chose comme properties.mapAll (data)
ou similaire. J'espère ne pas utiliser de bibliothèque car je le fais sur un modèle .html
dans GAS.
4 Réponses :
Vous pouvez utiliser Array #map
et Méthodes Array # reduction
. Itérer sur le second tableau à l'aide de Array #map
, dans cette méthode, utilisez Array # reduction
pour générer l'objet et renvoyer.
let properties = ['name', 'height', 'weight', 'zone'], data = [ ['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C'] ]; let res = data.map(arr => properties.reduce((obj, k, i) => (obj[k] = arr[i], obj), {})); console.log(res)
let res = data.map(arr => properties.reduce((obj, k, i) => (obj[k] = arr[i], obj)), {}));
ou
let properties = ['name', 'height', 'weight', 'zone'], data = [ ['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C'] ]; let res = data.map(arr => properties.reduce((obj, k, i) => Object.assign(obj, { [k]: arr[i] }), {})); console.log(res)
let res = data.map(arr => properties.reduce((obj, k, i) => Object.assign(obj, { [k]: arr[i] }), {}));
Si les propriétés seront toujours nom
, hauteur
, poids
et zone
, vous pouvez utiliser Array Destructuring pour appliquer un nom d'espace réservé et y stockent la valeur dans une map
.
var data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']]; var stats = data.map(function(dataArray) { return { name: dataArray[0], height: dataArray[1], weight: dataArray[2], zone: dataArray[3] } }) console.log(stats)
EDIT Basé sur le script étant sur GAS. Voici la même approche mais es5.
const data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']]; const stats = data.map(([name, height, weight, zone]) => ({ name, height, weight, zone })) console.log(stats)
cette approche n'utilise pas une approche dynamique en prenant des propriétés
.
Oui comme je l'ai dit ci-dessus car ce n'est pas clair dans l'OP Si les propriétés seront toujours le nom, la taille, le poids et la zone alors ...
Dans un fichier Apps Script .html
, vous pouvez utiliser du JavaScript moderne, à condition que le code en cours d’écriture soit évalué lors de l’exécution. Si le code est en cours d'exécution lors de l'appel à HtmlTemplate # evaluer
, alors la syntaxe JS doit probablement être cohérente avec JS 1.6 (+ Filtre de tableau / mappage / toutes / certaines / méthodes de réduction) .
Vous pouvez mapper de nouveaux objets en utilisant le tableau des propriétés pour créer des clés nommées et collecter tous les objets avec Object.assign
.
.as-console-wrapper { max-height: 100% !important; top: 0; }
var properties = ['name', 'height', 'weight', 'zone'], data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']], statistics = data.map(a => Object.assign(...properties.map((k, i) => ({ [k]: a[i] })))); console.log(statistics);
Vous pouvez utiliser Array Destructuring
pour extraire les valeurs et les remplacer par des propriétés nommées dans un objet renvoyé.
let data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']], result = data.map(([name, height, weight, zone]) => ({name, height, weight, zone})); console.log(r);
data.map(([name, height, weight, zone]) => ({name, height, weight, zone}));
Est-ce différent de quelque manière que ce soit de la réponse précédente de @FrancisLeigh? stackoverflow.com/a/55394677/9337071 Sauf si votre réponse contient moins d'informations?
@tehhowch Ah! Mes excuses. Je n'avais pas réalisé que c'était la même réponse syntaxique. Je supprimerai cette réponse dans un instant :)
properties = [nom, taille, poids, zone];
S'agit-il vraiment de 4 variables autonomes? Si c'est vrai, que sont-ils? Ou vouliez-vous utiliser des chaînes?Pour les répondeurs, google-apps-script est es3 avec des fonctions es5 sélectionnées comme la carte, la réduction, etc.
=>
ou...
n'est pas pris en charge.@TheMaster note que cela se fait dans un
.html
. Il n'est pas précisé si cela est fait dans le cadre deHtmlTemplate # evaluer
ou d'un vrai code côté client, donc les flèches et Object.assign peuvent bien être disponibles.