代码之家  ›  专栏  ›  技术社区  ›  Jens Törnell

在对象内部使用变量填充的javascript步骤

  •  1
  • Jens Törnell  · 技术社区  · 7 年前

    我尝试动态地深入对象内部。对象子对象未知,应改为从字符串中使用。

    我希望你能看到下面我试图做的事情。我已经指出了我找不出解决方案的部分。

    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 回复  |  直到 7 年前
        1
  •  1
  •   Kaddath    7 年前

    您可以这样做,存储一个var obj

    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);
        2
  •  1
  •   Karim    7 年前

    一种无外部变量的自包含递归解决方案

    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', {}));
        3
  •  0
  •   TLP    7 年前

    这样的办法应该行得通。 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;
    }
    
        4
  •  0
  •   Eugen Govorun    7 年前

    或者减少它

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