多个键名,相同的对值

Som*_*ica 23 javascript

我正在尝试在具有多个名称的密钥的JavaScript脚本中设置对象文字.引用相同的对象值,即我已经尝试过的类似的东西:

var holidays: {
    "thanksgiving day", "thanksgiving", "t-day": {
        someValue : "foo"
    }
}

var holidays: {
    ["thanksgiving day", "thanksgiving", "t-day"]: {
        someValue : "foo"
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以做到这一点?

Art*_*lev 11

另一种方法是进行一些后处理

function expand(obj) {
    var keys = Object.keys(obj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i],
            subkeys = key.split(/,\s?/),
            target = obj[key];
        delete obj[key];
        subkeys.forEach(function(key) { obj[key] = target; })
    }
    return obj;
}

var holidays = expand({
    "thanksgiving day, thanksgiving, t-day": {
        someValue : "foo"
    } 
});
Run Code Online (Sandbox Code Playgroud)


Sco*_*yet 9

JSON不提供这样的功能,也不提供Javascript对象文字.

你可以用这样的东西做:

holidays = {
    thanksgiving: {foo: 'foo'},
    groundhogDay: {foo: 'bar'},
    aliases: {
        'thanksgiving day': 'thanksgiving',
        't-day': 'thanksgiving',
        'Bill Murrays nightmare': 'groundhogDay'
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以检查

holidays[name] || holidays[holidays.aliases[name]]
Run Code Online (Sandbox Code Playgroud)

为您的数据.

这不是一个很好的解决方案.但是编写一个通过以下表示形式创建此类对象的小函数并不会太困难:

[
    {
        names: ['thanksgiving', 'thanksgiving day', 't-day'],
        obj: {foo: 'foo'}
    },
    {
        names: ['groundhogDay', 'Bill Murrays nightmare'],
        obj: {foo: 'bar'}
    },
]
Run Code Online (Sandbox Code Playgroud)

如果这样更容易维护.


Jos*_*nac 5

如果您负担得起RegExp执行和ES6代理的另一种解决方案:

let align = new Proxy({

    'start|top|left': -1,
    'middle|center': 0,
    'end|bottom|right': 1,

}, {

    get: function(target, property, receiver) {

        for (let k in target)
            if (new RegExp(k).test(property))
                return target[k]

        return null

    }

})

align.start     // -1
align.top       // -1
align.left      // -1

align.middle    // 0
align.center    // 0

align.end       // 1
align.bottom    // 1
align.right     // 1
Run Code Online (Sandbox Code Playgroud)

参见文档:https :
//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler/get