40

複数の名前を持つキーを持つ JavaScript スクリプトでオブジェクト リテラルを設定しようとしています。同じオブジェクト値、つまり私がすでに試したようなものを参照しています:

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

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

これを達成する方法はありますか?

4

10 に答える 10

18

別のアプローチは、後処理を行うことです

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"
    } 
});
于 2013-02-07T04:54:11.307 に答える
17

JSON はそのような機能を提供しておらず、Javascript オブジェクト リテラルも提供していません。

次のようなもので間に合わせることができるかもしれません:

holidays = {
    thanksgiving: {foo: 'foo'},
    groundhogDay: {foo: 'bar'},
    aliases: {
        'thanksgiving day': 'thanksgiving',
        't-day': 'thanksgiving',
        'Bill Murrays nightmare': 'groundhogDay'
    }
}

そして、あなたはチェックすることができます

holidays[name] || holidays[holidays.aliases[name]]

あなたのデータのために。

それは素晴らしい解決策ではありません。しかし、次のような表現からこの種のオブジェクトを作成する小さな関数を作成することはそれほど難しくありません。

[
    {
        names: ['thanksgiving', 'thanksgiving day', 't-day'],
        obj: {foo: 'foo'}
    },
    {
        names: ['groundhogDay', 'Bill Murrays nightmare'],
        obj: {foo: 'bar'}
    },
]

それが維持しやすいなら。

于 2013-02-07T04:41:35.420 に答える
3

次のようなことができると思います:

var holidays = {
  'thanksgiving day': {
    foo: 'foo'
  }
};

holidays.thanksgiving = holidays['t-day'] = holidays['thanksgiving day'];

これを頻繁に行っている場合や、より多くの価値がある場合は、次のパターンを検討してください。

'thanksgiving, t-day, thanks, thank, thank u'.split(',').forEach(function(key) {
  holidays[key] = holidays['thanksgiving day'];
});

より良いアプローチは、重複を追加するのではなく、事前にデータを処理することです.

于 2013-02-07T04:30:54.913 に答える