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');