шаг JavaScript внутри объекта, чтобы заполнить с переменной - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь динамически шагнуть вглубь объекта.Дочерние объекты неизвестны, и вместо этого их следует использовать из строки.

Я надеюсь, что ниже вы увидите, что я пытаюсь сделать.Я закомментировал ту часть, где я не могу найти решение.

var global_object = {};

function populate(id, text) {
  let parts = id.split('/');

  for(let key in parts) {
    let part = parts[key];
    // global_object['this']['is']['a']['long']['url'] = text;
    console.log(part);
  }
}

populate('this/is/a/long/url', 'My text');

Результаты могут быть примерно такими:

this: {
  is: {
    a: {
      long: {
        url: "My text"
      }
    }
  }
}

https://jsfiddle.net/2f6kue74/

Решения ES6 также принимаются

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Или уменьшите его

var global_object = {};

function populate(id, text) {
    global_object = id.split("/").reduceRight((acc, part) => {
        var nested = JSON.parse(JSON.stringify(acc));

        acc = {};
        acc[part] = nested;

        return acc;
    }, text);
}

populate("this/is/a/long/url", "My text");
0 голосов
/ 06 февраля 2019

вы можете сделать что-то вроде этого, сохранить переменную obj и помещать i в новый ключ каждый ход.Затем для текста используйте другую переменную, чтобы «запомнить» последнюю.

var global_object = {};

function populate(id, text) {
  let parts = id.split('/');
  let obj = global_object, last_obj, part;

  for(let key in parts) {
    part = parts[key];
    last_obj = obj;      
    obj[part] = {};
    obj = obj[part]
    console.log(part);
  }
  last_obj[part] = text;
}

populate('this/is/a/long/url', 'My text');
console.log(global_object);
0 голосов
/ 06 февраля 2019

Альтернативное рекурсивное решение, самодостаточное без внешних переменных

const populate = (id, text, result) => {
  const arr = id.split('/');
  let key = arr.shift();
  if(key) { 
    result[key] = {};
    if(!arr.length) { result[key] = text; }
    populate(arr.join("/"), text, result[key])
  }
  return result;
}

console.log(populate('this/is/a/long/url', 'My text', {}));
0 голосов
/ 06 февраля 2019

Нечто подобное должно работать.obj - текущий объект, который нужно заполнить, и он обновляется с каждой итерацией цикла for.

let obj = global_object;
function populate(id, text) {
    let parts = id.split('/');

    for (let key in parts) {
        let part = parts[key];
        obj[part] = {};
        obj = obj[part];

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