【问题标题】:Javascript Objects: Dynamically create properties and property namesJavascript 对象:动态创建属性和属性名称
【发布时间】:2014-11-11 17:45:02
【问题描述】:

我正在尝试在所有具有动态属性名称和属性的对象中动态创建对象。这是一个示例:

工作:

|  name  |  job  |  building  |
 -----------------------------
|  adam  |  mop  |  school    |
|  adam  | teach |  school    |
|  eve   | cook  |  kitchen   |
|  eve   |  mop  |  house     |

数据名称:

| name  |
---------
| adam  |
| eve   |

想要的结果:

names = {
    adam: {
        school: ["mop", "teach"] 
    },
    eve: {
        kitchen: ["cook"],
        house: ["mop"]
    }
}

该脚本用于google的app脚本中,所以不能使用eval()之类的函数。这是我当前的代码:

  namesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('dataNames');
  namesValues = namesSheet.getDataRange().getValues();
  jobsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('jobs');
  jobsValues = rolesSheet.getDataRange().getValues();
  jobsNumRows = rolesRange.getNumRows();

var names = {};
  for (item in namesValues) {
    //create new entry in names array with key name
    var name = namesValues[item];
    names[name] = {};                                  //<-- so far, so good

    //cycle through jobs sheet and find all buildings and jobs tied to name
    for(i=1;i<jobsNumRows;i++){

      var jobsName = jobsValues[i][0];
      if(jobsName == name){
        var buildingName = jobsValues[i][2];
        var jobDesc = jobsValues[i][1];           

        //Check if names.name already has a building property
        if(!names.name[buildingName]){
            names.name[buildingName] = []; //<-- doesn't work
        }

         names.name[buildingName].push(jobDesc);  <--probably wouldn't work...?

      }
    }
  } 
}

我该如何设置?我已经查看了有关在对象中创建动态命名属性的所有 SO 问题。这与两次执行此操作略有不同:动态命名属性的动态命名属性。除非当然,这没有什么不同?

谢谢!

【问题讨论】:

    标签: javascript google-apps-script javascript-objects dynamic-properties


    【解决方案1】:

    试试:

    if(!names[name][buildingName]){
        names[name][buildingName] = [];
    }
    
    names[name][buildingName].push(jobDesc);
    

    使用“。”运算符需要变量的实际值,因此您不能执行以下操作:

    var x = "variable";
    
    var obj = {};
    obj.x = {};
    

    这意味着obj 将有一个名为x 的属性,它与之前定义的变量无关。

    你应该使用这个:

    var obj = {}
    obj[x] = {}
    

    【讨论】:

    • 你是绝对正确的。 @TonyNardi 刚刚回答类似。不幸的是,我只能将一个答案标记为正确,但这是一个赞成票!
    【解决方案2】:

    我认为这些行应该是:

        //Check if names.name already has a building property
        if(!names[name][buildingName]){
            names[name][buildingName] = []; //<-- doesn't work
        }
    
         names[name][buildingName].push(jobDesc);  <--probably wouldn't work...?
    

    【讨论】:

    • 天才!谢啦。将在 3 分钟内标记为正确(S.O. 规则)
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2017-12-04
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多