Javascript:jak dynamicky vytvářet vnořené objekty pomocí názvů objektů daných polem

Doufám, že mi někdo může pomoci s tímto Javascriptem.

Mám objekt s názvem „Nastavení“ a rád bych napsal funkci, která k tomuto objektu přidá nová nastavení.

Název a hodnota nového nastavení jsou uvedeny jako řetězce. Řetězec s názvem nastavení je pak rozdělen podtržítky do pole. Nové nastavení by se mělo přidat do stávajícího objektu „Nastavení“ vytvořením nových vnořených objektů s názvy danými každou částí pole, kromě poslední části, která by měla být řetězcem udávajícím hodnotu nastavení. Měl bych se pak umět odkázat na nastavení a např. upozornit na jeho hodnotu. Mohu to udělat takto staticky…

var Settings = {};
var newSettingName = "Modules_Video_Plugin";
var newSettingValue = "JWPlayer";
var newSettingNameArray = newSettingName.split("_");

Settings[newSettingNameArray[0]] = {};
Settings[newSettingNameArray[0]][newSettingNameArray[1]] = {};
Settings[newSettingNameArray[0]][newSettingNameArray[1]][newSettingNameArray[2]] = newSettingValue;

alert(Settings.Modules.Mediaplayers.Video.Plugin);

… část, která vytváří vnořené objekty, to dělá …

Settings["Modules"] = {};
Settings["Modules"]["Video"] = {};
Settings["Modules"]["Video"]["Plugin"] = "JWPlayer";

Protože se však počet částí, které tvoří název nastavení, může lišit, např. newSettingName by mohlo být „Modules_Floorplan_Image_Src“, chtěl bych to udělat dynamicky pomocí funkce jako…

createSetting (newSettingNameArray, newSettingValue);

function createSetting(setting, value) {
    // code to create new setting goes here
}

Může mi někdo pomoci zjistit, jak to udělat dynamicky?

Předpokládám, že tam musí být smyčka for... k iteraci polem, ale nebyl jsem schopen přijít na způsob, jak vytvořit vnořené objekty.

Pokud jste se dostali až sem, velmi vám děkuji, že jste si našli čas na čtení, i když si nemůžete pomoci.

Odpověď

function assign(obj, keyPath, value) {
   lastKeyIndex = keyPath.length-1;
   for (var i = 0; i < lastKeyIndex; ++ i) {
     key = keyPath[i];
     if (!(key in obj)){
       obj[key] = {}
     }
     obj = obj[key];
   }
   obj[keyPath[lastKeyIndex]] = value;
}

Použití:

var settings = {};
assign(settings, ['Modules', 'Video', 'Plugin'], 'JWPlayer');