Объекты Javascript: динамически создавать свойства и имена свойств

Я пытаюсь динамически создавать объекты внутри объектов, которые имеют динамические имена и свойства. Вот образец:

работы:

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

dataNames:

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

Желаемый результат:

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

Этот скрипт используется в скрипте приложения Google, поэтому такие функции, как 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...?

      }
    }
  } 
}

Как я могу настроить это? Я посмотрел на все вопросы о создании динамически именованных свойств в объектах. Это немного отличается от того, что делали это дважды: динамически именуемое свойство динамически именованного свойства. Если, конечно, это не отличается?

Спасибо ТАК!

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...?

Пытаться:

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] = {}
Другие вопросы по тегам