2 votes

Comment transformer une chaîne en notation point en un objet en Javascript

J'essaie de transformer une chaîne de caractères en notation point dans un objet, par exemple donné

  [{
      key: 'app.team.instance',
      value: 'some value1'
  }, {
      key: 'app.team.instance.obj',
      value: 'some value'
  }, {
      key: 'app.team.app.some',
      value: 'some value'
  }, {
      key: 'app.service.awesome.more',
      value: 'more values'
  }]

Je voudrais en faire un objet comme pour obtenir

 {
  "team": {
      "instance": "some value1",
      "server": {
          "obj": "some value"
      },
      "app": {
          "some": "some value"
      }
  },
  "service": {
      "awesome": {
          "more": "more values"
      }
  }
}

C'est ce que j'ai essayé en utilisant la fonction suivante. En regardant ma fonction, qu'est-ce que j'ai manqué ou que je devrais améliorer ?

function createObjFromRows(skip, key, value, obj) {
    const ARRAY_KEYS = key.split('.');
    const ARRAY_LENGTH = ARRAY_KEYS.length;

    let i = skip ? 1 : 0;

    for (; i < ARRAY_LENGTH; i++) {
        if (i < (ARRAY_LENGTH - 1)) {
            if (!obj.hasOwnProperty(ARRAY_KEYS[i])) { obj[ARRAY_KEYS[i]] = {}; }
        } else {
            obj[ARRAY_KEYS[i - 1]][ARRAY_KEYS[i]] = value;
        }
    }
}

C'est ce que je reçois actuellement.

{
    team: {
        instance: 'some value1'
    },
    server: {
        obj: 'some value'
    },
    app: {
        some: 'some value'
    },
    service: {},
    awesome: {
        more: 'more values'
    }
}

4voto

Faly Points 10850

Vous pouvez utiliser array.prototype.reduce :

  var datas = [ {key: 'app.team.instance', value: 'some value1'}, {key: 'app.team.server.obj', value: 'some value'}, {key: 'app.team.app.some',value: 'some value'}, {key: 'app.service.awesome.more', value: 'more values'}];

var res = datas.reduce((m, o) => {
    var keys = o.key.split('.');
    var cur = m;
    keys.forEach((key, i) => { 
        if (i < keys.length - 1) {
            cur[key] = cur[key] || {};
            cur = cur[key];
        } else {
            cur[key] = o.value;
        }
    });
    return m;
}, {});

console.log(res);

3voto

Nina Scholz Points 17120

Vous pouvez diviser les chaînes de clés données et enregistrer la dernière clé pour l'affectation de la valeur après avoir itéré les clés de la propriété imbriquée.

var data = [{ key: 'app.team.instance', value: 'some value1' }, { key: 'app.team.server.obj', value: 'some value' }, { key: 'app.team.app.some', value: 'some value' }, { key: 'app.service.awesome.more', value: 'more values' }],
    result = data.reduce(function (r, o) {
        var path = o.key.split('.'),
            last = path.pop();

        path.reduce(function (p, k) {
            return p[k] = p[k] || {};
        }, r)[last] = o.value;
        return r;
    }, {});

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X