bugfix> javascript > 投稿

オブジェクトを生成するために、次のコードスニペットを作成しました。

{
    "2018": {
        "02": {
            "18": {
                "scheduledSlots": 0,
                "totalSlots": 0,
                "slots": null
            }
        }
    }
}

これは間違っているように感じます

  const obj = {}
        obj[date[2]] = {};
        obj[date[2]][date[1]] = {};
        obj[date[2]][date[1]][date[0]] = {};
        const day = obj[date[2]][date[1]][date[0]];
        day.scheduledSlots = 0;
        day.totalSlots = 0;
        day.slots = null;

これにアプローチするより良い方法があるかどうかを知る必要があります

これはハッシュマップです。
別の日を追加する必要があります。

{
    "2018": {
        "02": {
            "18": {
                "scheduledSlots": 0,
                "totalSlots": 0,
                "slots": null
            }
        }
        "03": {
            "12": {
                "scheduledSlots": 0,
                "totalSlots": 0,
                "slots": null
            }
        }
    }
}

回答 2 件
  • オブジェクト全体を一度に作成する場合、リテラル表記を使用できます。

    const obj = {
        [date[2]]: {
            [date[1]]: {
                [date[0]]: {
                    scheduledSlots: 0,
                    totalSlots: 0,
                    slots: null
                }
            }
        }
    }
    
    

    または、後で const day へのアクセスが必要な場合 :

    const day = {
        scheduledSlots: 0,
        totalSlots: 0,
        slots: null
    }
    const obj = {
        [date[2]]: {
            [date[1]]: {
                [date[0]]: day
            }
        }
    }
    
    

    @EDIT反復する必要がある場合、これは仕事をするはずです:

    Object.prototype._next = function(name)
    {
        if(!this[name]) this[name] = {};
        return this[name];
    }
    const obj = {}
    const day = obj._next(date[2])._next(date[1])._next(date[0]) = {
        scheduledSlots: 0,
        totalSlots: 0,
        slots: null
    }
    
    

  • 値のプロパティへのパスを指定することにより、組み合わせたアプローチを使用できます。

    function setValue(object, path, value) {
        var last = path.pop();
        path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
    }
    var object = {},
        date = '18-02-2018'.split('-').reverse();
    setValue(object, [... date, 'scheduledSlots'], 0);
    setValue(object, [... date, 'totalSlots'], 0);
    setValue(object, [... date, 'slots'], null);
    console.log(object);
    
    
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    
    

あなたの答え