【问题标题】:javascript step inside object to populate with variablejavascript步入对象以填充变量
【发布时间】:2019-02-06 12:12:21
【问题描述】:

我尝试动态地深入一个对象。对象 children 是未知的,应该从字符串中使用。

我希望你能在下面看到我尝试做的事情。我已经注释掉了我无法找到解决方案的部分。

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 解决方案

【问题讨论】:

  • 你的问题的答案是相似的,如果不一样的话:@Tony 虽然你正在做的事情被认为是不好的做法。 stackoverflow.com/questions/20424226/…
  • @ElieNassif 谢谢!为什么它被认为是不好的做法,还有什么替代方法?
  • @JensTörnell 如果您重命名另一段代码中的一个属性,则当前代码将不起作用。除非您对其进行大量控制。不确定您的项目的上下文是什么。
  • @ElieNassif 我尝试生成某种文件/文件夹 API,用于使用 ajax 从 PHP 获取文件和文件夹。这个想法是,当我发送我称之为的 url 或 id 时,它应该填充这个嵌套对象。然后稍后我可以使用该对象将文件树呈现为来自 js 的 html 元素。

标签: javascript object variables


【解决方案1】:

您可以这样做,存储一个 var obj 并在每回合将 i 放入一个新键中。然后对于文本,使用另一个 var 来“记住”最后一个。

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】:

    另一种自包含的递归解决方案,没有外部变量

    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】:

      这样的事情应该可以工作。 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】:

        或者减少它

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

        【讨论】:

          猜你喜欢
          • 2015-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-17
          • 2016-01-12
          • 1970-01-01
          • 2014-03-25
          相关资源
          最近更新 更多