【问题标题】:Access object var in object [duplicate]访问对象中的对象var [重复]
【发布时间】:2016-07-08 00:34:42
【问题描述】:

我有一个这样的对象...

"data": {

   "1": {
      "id": 32,
      "name": "E",
      "link": "", 
    },
    "2": {
      "id": 33,
      "name": "EC",
      "link": "", 
    },

}

如何使用上面的变量设置每个“链接”值?例如,我想做一些类似

的事情
"data": {

  "1": {
     "id": 32,
     "name": "E",
     "link": "id="+this.id+" and name="+this.name, 
  },
  "2": {
     "id": 33,
     "name": "EC",
     "link": "id="+this.id+" and name="+this.name, 
  },

把物体做成这样...

"data": {

  "1": {
     "id": 32,
     "name": "E",
     "link": "id=32 and name=E", 
  },
  "2": {
     "id": 33,
     "name": "EC",
     "link": "id=33 and name=EC", 
  },

【问题讨论】:

  • 您的尝试有什么问题?您是否尝试过您正在考虑的代码?
  • 你试过什么?您是否设置了一个循环来执行此操作?
  • 你可以创建一个访问器属性或者在事后计算它。
  • 我得到:id="" and name=undefined
  • @JosephMarikle 我没有循环我只有一个来自 id 1 - id 200 的长对象,我打算手动输入 "link": "id=33 and name=EC" 和依此类推,但认为用 this.name 替换所有“链接”的字符串会更快

标签: javascript variables object


【解决方案1】:

我建议迭代属性并更改想要的项目。

var object = { data: { "1": { "id": 32, "name": "E", "link": "", }, "2": { "id": 33, "name": "EC", "link": "", } } };

Object.keys(object.data).forEach(function (k) {
    object.data[k].link = 'id=' + object.data[k].id + ' and name=' + object.data[k].name;
});

document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');

【讨论】:

    【解决方案2】:

    我通常把它变成一个函数:

    "data": {
    
      "1": {
         "id": 32,
         "name": "E",
         "get_link": function() { return "id="+this.id+" and name="+this.name } 
      }
    
    }
    

    然后你像whatever.get_link()一样访问它

    【讨论】:

      【解决方案3】:

      有两种方法可以解决这个问题。

      您可以创建一个后处理器来处理占位符值。我做了一个通用预处理器,它应该动态搜索所有字符串属性的占位符。

      var linkStore = {
        "data": {
          "1": {
            "id": 32,
            "name": "E",
            "link": "id={{id}} and name={{name}}"
          },
          "2": {
            "id": 33,
            "name": "EC",
            "link": "id={{id}} and name={{name}}"
          }
        }
      };
      
      function postProcess(data, root) {
        var records = root != null ? data[root] : data;
        Object.keys(records).forEach(function(recordId) {
          var record = records[recordId];
          Object.keys(record).forEach(function(property) {
            if (typeof record[property] === 'string') {
              record[property] = record[property].replace(/{{(\w+)}}/g, function(match, value) {
                return record[value];
              });
            }
          });
        });
        return data;
      }
      
      var result = postProcess(linkStore, 'data');
      
      document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 2) + '</pre>';

      或者如果您不想修改原始数据。您可以添加要应用于每条记录的属性映射。

      var linkStore = {
        "data": {
          "1": {
            "id": 32,
            "name": "E",
            "link": ""
          },
          "2": {
            "id": 33,
            "name": "EC",
            "link": ""
          }
        }
      };
      
      function postProcess(data, root, propertyMap) {
        var records = root != null ? data[root] : data;
        Object.keys(records).forEach(function(recordId) {
          var record = records[recordId];
          Object.keys(propertyMap).forEach(function(property) {
            record[property] = propertyMap[property].call(record, record[property]);
          });
        });
        return data;
      }
      
      var result = postProcess(linkStore, 'data', {
        link : function(oldValue) {
          return 'id=' + this.id + ' and name=' + this.name
        }
      });
      
      document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 2) + '</pre>';

      【讨论】:

        猜你喜欢
        • 2018-06-18
        • 2013-01-31
        • 1970-01-01
        • 2019-02-04
        • 2012-09-29
        • 2013-07-01
        • 2012-10-30
        • 2021-09-09
        • 2020-09-19
        相关资源
        最近更新 更多