Объекты 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] = {}