gpt4 book ai didi

javascript - 如何使用 RegExp 文字作为对象键?

转载 作者:IT王子 更新时间:2023-10-29 03:20:18 26 4
gpt4 key购买 nike

我想使用创建一个包含正则表达式作为键值的对象。我尝试使用以下语法:

var kv = {
/key/g : "value"
};

但根据 JavaScript lint 失败了:

SyntaxError: invalid property id

我该如何解决?

更新

背景:我想这样做的原因是实现一种解决方法,修复 HTTP API 结果中的错误 unicode。我知道这很骇人听闻,但由于我无法控制 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;
}

但我想实现使用 JavaScript 对象将键映射为值:

function fixUnicode(text) {

var result = text;
var keys = {
/&Atilde;&copy;/g : "&eacute;",
/&Atilde;&uml;/g : "&egrave;"
// etc...
};

for (var key in keys) {
result = result.replace(key, keys[key]);
}
return result;
}

最佳答案

这可以做到,但不能使用对象字面量语法。你需要这样做:

var kv = {};
kv[/key/g] = "value";
console.log(kv[/key/g]); // "value"


编辑:这可能需要一些解释。正如 xanatos 在下面评论的那样,这里真正发生的是 key /key/g 在这种情况下,正在被 toString() 创建 key 。了解这一点很重要,因为它会影响 key 的唯一性。请考虑以下事项:

var x = {},
reg = /foo/;

x[reg] = 'bar';
console.log(x[reg]); // "bar"
console.log(x[reg.toString()]); // "bar"
console.log(x['/foo/']); // "bar'

总而言之,我有点不敢问为什么你需要这样做,但假设你有你的理由,请小心并确保你了解什么真的发生了:)


编辑 2:因此,在回答您更新的问题时,您应该能够实现与您想要的非常接近的东西。只要将正则表达式用引号引起来,就可以使用对象字面量语法。不幸的是,这意味着您必须从该键中手动重建一个实际的 RegExp 对象。例如:

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


编辑 3:因为,为什么不呢。我一直坚持让你的对象字面量语法起作用,以至于我没有考虑这样一个事实,即你永远不需要实际查找模式本身的替换(即,根本不需要对象键)。下面是一种使用不需要 RegExp 重建的数组的更有效方法:

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


编辑 4:因为我很无聊而且我喜欢这个问题。这是忍者版本:

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

关于javascript - 如何使用 RegExp 文字作为对象键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7365027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com