1. ホーム
  2. javascript

[解決済み] Javascript: 配列で指定したオブジェクト名でネストされたオブジェクトを動的に作成する方法

2023-07-05 05:52:37

質問

このJavascriptについて、どなたか教えていただければと思います。

私は"Settings"というオブジェクトを持っていて、そのオブジェクトに新しい設定を追加する関数を書きたいと思います。

新しい設定の名前と値は文字列として提供されます。設定名を与える文字列は、アンダースコアによって配列に分割されます。新しい設定は、配列の各部分によって与えられる名前を持つ新しいネストされたオブジェクトを作成することによって、既存の "Settings"オブジェクトに追加されるはずですが、最後の部分は、設定の値を与える文字列になるはずです。これで、設定を参照して、その値を警告することができるようになります。静的な方法でこれを行うには、次のようにします...

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

... ネストされたオブジェクトを作成する部分はこうなっています...

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

しかし、設定名を構成するパーツの数は様々で、例えば newSettingName は "Modules_Floorplan_Image_Src" となる可能性があるので、次のような関数を使って動的にこれを行いたいと思います...

createSetting (newSettingNameArray, newSettingValue);

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

どなたか、これを動的に実行する方法を教えていただけませんか?

私は、配列を反復するためにそこにfor...ループがなければならないと仮定しますが、私はネストされたオブジェクトを作成する方法を見つけ出すことができませんでした。

もしあなたがここまで読んでくれたなら、たとえあなたが助けられなくとも、読むのに時間を割いてくれて本当にありがとうございます。

どのように解決するのですか?

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;
}

使用方法

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