在对象中设置等于两个不同元素的字符串

时间:2019-01-04 22:15:20

标签: javascript arrays

我想在一个对象中将两个元素设置为一个字符串。我可以这样在两行中完成它。

var strings =
{
    "1": "string 1",
    "01": "string 1"
}

但是我希望它像这样一行。

var strings =
{
    "1", "01": "string 1"
}

那显然是行不通的。有没有一种写法可以使两个元素都等于一个字符串?

4 个答案:

答案 0 :(得分:1)

您可以使用Proxy并将键归一化为不带前导零的数字值。

var p = new Proxy(
        { 1: 'string 1' },
        {
            get: function(obj, prop) {
                return prop in obj
                    ? obj[prop]
                    : obj[+prop];
            }
        }
    );

console.log(p['1']);
console.log(p['01']);

答案 1 :(得分:1)

  

但是我希望它像这样一行。

JavaScript不在乎换行符。您可以全部写在一行中:

root

更严重的是,如果您只是想避免重复该值(例如,在重构时避免输入错误),那么最简单的解决方案是将值分别存储在变量中:

var strings = { "1": "string 1", "01": "string 1"};

如果您不希望复制该赋值,则可以使用以下事实:赋值会返回分配的值:

const value = "string 1";
var strings =
{
    "1": value,
    "01": value,
};

如果这些都以简单干净的方式表达了意图。别太聪明,保持简单


但是,从注释看来,您似乎希望两个属性的值“同步”。使用“常规”属性分配是不可能的。进行var strings = {}; strings['1'] = strings['01'] = "string 1"; 不会不会更改strings[1] = "new value";的值。

为此,您需要使用 getters setters (或者,可以使用代理)。

strings['01']

答案 2 :(得分:0)

您可以在第二个条目中添加一个函数,作为对对象本身的回调。这需要将其作为函数来访问,而不是参数。

var strings = {
    "One": "string 1",
    "Two" : function(){ return this.One;}
}

console.log(strings.One);
console.log(strings.Two());

strings.One = "Waffle"
console.log(strings.Two());

唯一的区别是您必须通过函数调用来访问参数。

编辑:

添加了一个带有Getter的示例来否定调用作为函数。

var strings = {
    "One": "string 1",
    get Two(){ return this.One;}
}

console.log(strings.One);
console.log(strings.Two);

strings.One = "Waffle"
console.log(strings.Two);

答案 3 :(得分:0)

我认为这就是您想要的:

var str = "string 1";

var obj = {"1": str, "01": str};

console.log(obj);

{ '1': 'string 1', '01': 'string 1' }