J'ai un objet que j'ai dû démonter en deux tableaux pour le gérer correctement. Cela ressemblait à ceci:

{
  city:"stuttgart",
  street:"randomstreet",
  ...
}

Puisqu'il doit correspondre à une certaine directive, j'ai dû le convertir en:

[
  {key:"city", value:"stuttgart"}
  {key:"street", value:"randomstreet"},
  ...
]

Pour cela, j'ai d'abord utilisé

var mapFromObjectWithIndex = function (array) {
  return $.map(array, function(value, index) {
    return [value];
  });
};

var mapFromObjectWithValue = function (array) {
  return $.map(array, function(value, index) {
    return [index];
  });
});

Pour créer deux tableaux, l'un contenant l'ancienne clé, l'autre contient l'ancienne valeur. Ensuite, j'ai créé un autre tableau bidimensionnel les mappant dans un seul tableau faisant cela

var mapToArray = function (arrayValue, arrayIndex) {
  var tableData = [];
  for (var i = 0; i<arrayIndex.length; i++){
    tableData[i] = {key:arrayIndex[i] , value:arrayValue[i]};
  }
  return tableData;
};

(peut-être que j'ai déjà foiré ici, cela peut-il être plus facile?)

Maintenant, j'utilise le tableau (table Data) pour afficher les données dans un formulaire. Les champs de valeur peuvent être modifiés. À la fin, je veux convertir le tableau (données de la table) à son original. (voir premier objet)

Veuillez noter que l'objet d'origine ne contient pas seulement des chaînes en tant que valeurs, mais peut également contenir des objets.

2
mchl18 9 août 2016 à 17:59

4 réponses

Meilleure réponse

Je pense que la conversion peut être nettement plus facile:

var obj = {
  city:"stuttgart",
  street:"randomstreet",
};

var tableData = Object.keys(obj).map(k => {return {key: k, value: obj[k]}});

console.log(tableData);

var dataBack = {};
tableData.forEach(o => dataBack[o.key] = o.value);

console.log(dataBack);

Que voulez-vous faire avec les objets? Voulez-vous les développer également? Si oui, vous pouvez faire quelque chose comme ça (et cela fonctionne aussi avec les objets imbriqués):

var obj = {
  city:"stuttgart",
  street:"randomstreet",
  obj: {a: 'a', b: 'b'},
  subObject: {aha: {z: 'z', y: 'y'}}
};

function trasformToTableData(obj) {
  if (typeof obj !== 'object') return obj;
  return Object.keys(obj).map(k => {return {key: k, value: trasformToTableData(obj[k])}});
}

var tableData = trasformToTableData(obj);
console.log(tableData);

function transformBack(obj) {
  if (Array.isArray(obj)) {
    var support ={};
    for (let i = 0; i < obj.length; i++) {
      support[obj[i].key] = transformBack(obj[i].value)
    }
    return support;
  }
  return obj;
}

var dataBack = {};
tableData.forEach(o => dataBack[o.key] = transformBack(o.value));

console.log(dataBack);
8
rpadovani 9 août 2016 à 15:17

Amusons-nous et transformons notre objet en itérable pour faire le travail comme suit;

var input = {city:"stuttgart", street:"randomstreet", number: "42"};
   output = [];
input[Symbol.iterator] = function*(){
                           var ok = Object.keys(this),
                                i = 0;
                           while (i < ok.length) yield {key : ok[i], value: this[ok[i++]]};
                         };
output = [...input];
console.log(output);
3
Redu 9 août 2016 à 15:14

Je ferais quelque chose comme ça:

var dataObj = {
  city:"stuttgart",
  street:"randomstreet",
};

function toKeyValue(obj) {
  var arr = [];
  for (var key in obj) {
    if(obj.hasOwnProperty(key)) {
      arr.push({'key': key, 'value': obj[key]});
    }
  }
  return arr;
}

var arrayKeyValue = toKeyValue(dataObj);
console.log(arrayKeyValue);
1
Corey Sery 9 août 2016 à 15:11

Cette fonction mappera votre objet à un tableau lorsque vous appelez objVar.mapToArray(), en utilisant Object.keys() et .map()

Object.prototype.mapToArray = function() {
  return Object.keys(this).map(function(v) {
    return { key: v, value: this[v] };
  }.bind(this));
}
2
Joah Gerstenberg 9 août 2016 à 15:07