2009-12-15 55 views
0

我正在处理JavaScript中的对象已经从可能包含变量名是不是有效的JavaScript变量名称的API返回。 (这些名称在我正在使用的API的系统的命名惯例中有效)将表单名称转换为有效的JavaScript名称的方法?

在一种情况下,名称以数字开始,例如, '5story'

将此名称转换为有效的JavaScript变量名称的最佳方法是什么? (对于这个问题,一个有用的答案应该是一个(希望是简单的)算法,例如在名称前加一个$,然后在将表单返回给API时去掉它)

(我注意到,这将是可取的,如果的JavaScript API没有创建无效名称)

+0

用户的preg_replace和删除号码? – Steven 2009-12-15 01:00:20

回答

1

请注意,我不知道你问的HTML标识名称(你提到的“形式”)或Javascript可变标识符,但剥掉任何不是单词字符的字符(A-Za-z,0-9,_)下划线?

var v = ' .-*&*$*$W 5 foo Bar'; 
v = '_' + v.replace(/\W/g, ''); 
v; // _W5fooBar 

.replace()的将剥离是not legal in variable identifiers字符。

您也可以使用$符号而不是下划线来为合法变量名加上前缀。

1

你可以创造中还包含一个反向引用原名称的包装对象。

function MyApiClient() 
{ 
     var _self = this; 
     this.RegisterWrapper = function(strName, objValue, explicitName) 
     { 
       var newName = (explicitName != null) ? explicitName : '_' + strName.replace(/\W/g, ''); 
       _self[newName] = {ApiName : strName, Value : objValue}; 
       return _self[newName]; 
     } 
} 

//implementation 
var client = new MyApiClient(); 
client.RegisterWrapper('5story', [0,1,2,3,4,5]); 
console.log(client._5story.Value); //output: Array() [0,1,2,3,4,5]; 
//or 
var o = client.RegisterWrapper('5story', {a:'b'}, '_myName'); 
console.log(o.Value); //outpus Object a: 'b' 
console.log(client._myName.Value); //outpus Object a: 'b' 

这扩展了几个额外的好处

  • 范围:创建它们将被封装的新对象,而不是全局
  • 时参考:如果你有参考这个对象 - 你可以用它来打你的API(因为它会包含旧名称)
  • 灵活性:你可以在解析从api返回的字符串或者像上面那样明确地通过循环动态注册包装。

您是否还有关于实际api的更多信息?

+0

岂不accesing client._5story打印等的对象{ApiName: '5story',值:[0,1,2,3,4,5]}?至少,这是您在调用RegisterWrapper时存储在MyApiClient对象中的内容。 – Juan 2009-12-15 01:59:48

+0

heh,你 - 我将它改为.Value – Skawful 2009-12-15 02:14:18