我想在一个对象中将两个元素设置为一个字符串。我可以这样在两行中完成它。
var strings =
{
"1": "string 1",
"01": "string 1"
}
但是我希望它像这样一行。
var strings =
{
"1", "01": "string 1"
}
那显然是行不通的。有没有一种写法可以使两个元素都等于一个字符串?
答案 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' }