我想使用创建一个包含正则表达式作为键值的对象.我尝试使用以下语法:
var kv = {
/key/g : "value"
};
Run Code Online (Sandbox Code Playgroud)
但它根据JavaScript lint失败:
SyntaxError: invalid property id
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
背景:我之所以这样做,是为了实现修复HTTP API结果中错误的unicode的解决方法.我知道这是非常hackish,但由于我无法控制API服务器代码,我认为这是我能做的最好的.
目前我通过键数组和值数组实现了映射:
function fixUnicode(text) {
var result = text;
var keys = [];
var values = [];
keys.push(/é/g); values.push("é");
keys.push(/è/g); values.push("è");
keys.push(/ê/g); values.push("ê");
keys.push(/ë/g); values.push("ë");
keys.push(/Ã /g); values.push("à");
keys.push(/ä/g); values.push("ä");
keys.push(/â/g); values.push("â");
keys.push(/ù/g); values.push("ù");
keys.push(/û/g); values.push("û");
keys.push(/ü/g); values.push("ü");
keys.push(/ô/g); values.push("ô");
keys.push(/ö/g); values.push("ö");
keys.push(/î/g); values.push("î");
keys.push(/ï/g); values.push("ï");
keys.push(/ç/g); values.push("ç");
for (var i = 0; i < keys.length; ++i) {
result = result.replace(keys[i], values[i]);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但我想实现使用JavaScript对象将键映射为值:
function fixUnicode(text) {
var result = text;
var keys = {
/é/g : "é",
/è/g : "è"
// etc...
};
for (var key in keys) {
result = result.replace(key, keys[key]);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
jma*_*777 45
这可以完成,但不能使用对象文字语法.你需要这样做:
var kv = {};
kv[/key/g] = "value";
console.log(kv[/key/g]); // "value"
Run Code Online (Sandbox Code Playgroud)
/key/g在这种情况下,关键是toString()要创建密钥.这一点很重要,因为它会对密钥的唯一性产生影响.考虑以下:
var x = {},
reg = /foo/;
x[reg] = 'bar';
console.log(x[reg]); // "bar"
console.log(x[reg.toString()]); // "bar"
console.log(x['/foo/']); // "bar'
Run Code Online (Sandbox Code Playgroud)
总之,我半害怕问为什么你需要做到这一点,但假设你有你的理由,要小心,确保您了解什么是真正发生的事情:)
var result = "abcdef",
replacements = {
"/a/g": "FOO",
"/d/i": "BAR"
};
for (var key in replacements) {
var parts = key.split('/');
result = result.replace(new RegExp(parts[1], parts[2]), replacements[key]);
}
console.log(result); //FOObcBARef
Run Code Online (Sandbox Code Playgroud)
var result = "abcdef",
replacements = [
[/a/g, "FOO"],
[/d/i, "BAR"]
];
for (var i = 0, len = replacements.length; i < len; i++) {
var replacement = replacements[i];
result = result.replace(replacement[0], replacement[1]);
}
console.log(result); //FOObcBARef
Run Code Online (Sandbox Code Playgroud)
var result = "abcdef",
replacements = [
[/a/g, "FOO"],
[/d/i, "BAR"]
], r;
while ((r = replacements.shift()) && (result = String.prototype.replace.apply(result, r))) {}
console.log(result); //FOObcBARef
Run Code Online (Sandbox Code Playgroud)
我认为这个问题值得更新答案.从ES6开始,创建了一个名为Map的新类型(标准内置对象)来覆盖像这样的案例.
Map与Object非常相似,但它允许任何类型作为键.
然后可以使用Map.prototype.forEach()循环遍历每个键/值对.
在您的情况下,您的功能现在可以是:
function fixUnicode(text) {
var result = text;
var replaceMap = new Map();
replaceMap.set(/é/g, "é");
replaceMap.set(/è/g, "è");
replaceMap.set(/ê/g, "ê");
replaceMap.set(/ë/g, "ë");
replaceMap.set(/Ã /g, "à");
replaceMap.set(/ä/g, "ä");
replaceMap.set(/â/g, "â");
replaceMap.set(/ù/g, "ù");
replaceMap.set(/û/g, "û");
replaceMap.set(/ü/g, "ü");
replaceMap.set(/ô/g, "ô");
replaceMap.set(/ö/g, "ö");
replaceMap.set(/î/g, "î");
replaceMap.set(/ï/g, "ï");
replaceMap.set(/ç/g, "ç");
replaceMap.forEach(function (newString, old) {
result = result.replace(old, newString);
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
您可以在MDN上阅读有关地图的更多信息
| 归档时间: |
|
| 查看次数: |
13875 次 |
| 最近记录: |