有没有更短的方法

时间:2018-05-25 07:21:19

标签: javascript json

我编写了以下代码片段来生成对象。

{
    "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 个答案:

答案 0 :(得分:3)

如果您一次创建整个对象,可能需要使用literal notation

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
}

答案 1 :(得分:2)

您可以通过提供值的属性路径来使用组合方法。



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