Javascript вложенные объекты из строки - PullRequest
7 голосов
/ 04 октября 2011

У меня есть пустой объект и строка:

var obj = {};
var str = "a.b.c";

Есть ли способ, которым я могу превратить это в

obj = { a: { b: { c: { } } } }

Я не могу обернуть голову вокруг этого, и я даже не уверен, возможно ли это.

Ответы [ 5 ]

9 голосов
/ 04 октября 2011
var obj = {};
var str = "a.b.c";
var arr = str.split('.');
var tmp = obj;

for (var i=0,n=arr.length; i<n; i++){
   tmp[arr[i]]={};
   tmp = tmp[arr[i]];
}

ES6:

let str = "a.b.c",
    arr = str.split('.'),
    obj, o = obj = {};

arr.forEach(key=>{o=o[key]={}});

console.log(obj);

ES6 / Сокращенный (хранение массива не требуется):

let str = "a.b.c", obj, o = obj = {};

str.split('.').forEach(key=>o=o[key]={});

console.log(obj);

ES6 / Array.prototype.reduce:

let str = "a.b.c", last;

let obj = str.split('.').reduce((o, val) => {
  if (typeof last == 'object')
    last = last[val] = {};
  else
    last = o[val] = {};

  return o;
}, {});

console.log(obj);
3 голосов
/ 04 октября 2011

Эта рекурсивная функция возвращает вам строковое представление нужного объекта

//Usage: getObjectAsString('a.b.c'.split(/\./))
function getObjectAsString (array){
   return !array.length ? '{}' 
             : '{"' + array[0] + '":' + getObjectAsString (array.slice(1)) + '}';
}

Теперь вы можете преобразовать вывод getObjectAsString в объект, используя

JSON.parse(getObjectAsString('a.b.c'.split(/\./)))

РЕДАКТИРОВАТЬ : Удалена версия «Ввод в виде строки», поскольку она работает только для однобуквенных подчастей в пространстве имен, например, в вопросе (a.b.c), что, как правило, не так.

3 голосов
/ 04 октября 2011

Это из файла yui2 yahoo.js.

YAHOO.namespace = function() {
  var a=arguments, o=null, i, j, d;
  for (i=0; i<a.length; i=i+1) {
      d=(""+a[i]).split(".");
      o=YAHOO;

      // YAHOO is implied, so it is ignored if it is included
      for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; j=j+1) {
          o[d[j]]=o[d[j]] || {};
          o=o[d[j]];
      }
  }

  return o;
};

См. Источник документации.

https://github.com/yui/yui2/blob/master/src/yahoo/js/YAHOO.js

0 голосов
/ 04 октября 2011

Вот мое мнение:

function ensureKeys(str, obj) {
    for(var parts = str.split('.'), i=0, l=parts.length, cache=obj; i<l; i++) {
        if(!cache[parts[i]]) { 
            cache[parts[i]] = {};
        }
        cache = cache[parts[i]];
    }

    return obj;
}

var obj = {};
ensureKeys('a.b.c', obj);
// obj = { a: { b: { c: {} } } }
0 голосов
/ 04 октября 2011

Вот, пожалуйста,

var string = "a.b.c",
   array = string.split('.');
JSON.parse("{\"" + array.join('": {\"') + "\": {" +array.map(function () {return '}'}).join('') + "}")

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...