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 # evaluerou d'un vrai code côté client, donc les flèches et Object.assign peuvent bien être disponibles.