1
votes

Mappage d'objets un-à-un Javascript (fonction intégrée?)

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.


3 commentaires

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


4 Réponses :


1
votes

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] }), {}));


0 commentaires

7
votes

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)


3 commentaires

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) .



4
votes

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);


0 commentaires

0
votes

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}));


2 commentaires

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 :)