Рассмотрите этот JavaScript:
var values = {
name: "Joe Smith",
location: {
city: "Los Angeles",
state: "California"
}
}
var string = "{name} is currently in {location.city}, {location.state}";
var out = string.replace(/{([\w\.]+)}/g, function(wholematch,firstmatch) {
return typeof values[firstmatch] !== 'undefined' ?
values[firstmatch] : wholematch;
});
Это произведет следующее:
Joe Smith is currently in {location.city}, {location.state}
Но я хочу произвести следующее:
Joe Smith is currently in Los Angeles, California
Я ищу хороший способ преобразовать несколько уровней записи через точку, которая, как находят между фигурными скобками в строке в несколько параметров, использовалась с нотацией скобки, как это:
values[first][second][third][etc]
По существу, для этого примера, я пытаюсь выяснить, из какой строки regex и функции я должен был бы закончить с эквивалентом:
out = values[name] + " is currently in " + values["location"]["city"] +
values["location"]["state"];
Примечание: Я хотел бы сделать это без использования eval()
.
Использование вспомогательной функции для итеративного доступа к свойствам:
function getNestedValue(obj, prop) {
var value, props = prop.split('.'); // split property names
for (var i = 0; i < props.length; i++) {
if (typeof obj != "undefined") {
obj = obj[props[i]]; // go next level
}
}
return obj;
}
var string = "{name} is currently in {location.city}, {location.state}";
var out = string.replace(/{([^}]+)}/g, function(wholematch,firstmatch) {
var value = getNestedValue(joe, firstmatch);
return typeof value !== 'undefined' ? value : wholematch;
});
// "Joe Smith is currently in Los Angeles, California"
Попробуйте приведенный выше пример здесь .
Правка : что-то слегка элегантное , использующее метод Array.prototype.reduce
, часть нового стандарта ECMAScript 5th Edition:
function replace(str, obj) {
return str.replace(/{([^}]+)}/g, function(wholematch,firstmatch) {
var value = firstmatch.split('.').reduce(function (a, b) {
return a[b];
}, obj);
return typeof value !== 'undefined' ? value : wholematch;
});
}
replace("{name} is currently in {location.city}, {location.state}", values);
// "Joe Smith is currently in Los Angeles, California"
Попробуйте новый пример здесь .
Вы можете взглянуть на тему Безошибочный глубокий доступ к свойствам?, опубликованную на comp.lang.javascript - там представлено несколько подходов для выполнения того, что вы хотите.
Для regexp все, что вам нужно, это /{.*?}/g
Я не уверен, как интегрировать это в Javascript, но вот фрагмент кода Java, который использует регулярное выражение для преобразования, которое вам нужно:
String[] tests = {
"{name}",
"{location.city}",
"{location.state.zip.bleh}",
};
for (String test : tests) {
System.out.println(test.replaceAll("\\{?(\\w+).?", "[$1]"));
}
Это печатает:
[name]
[location][city]
[location][state][zip][bleh]
По сути, он заменяет все вхождения от \ {? (\ w +).?
до [$ 1]
.