Мне нужно найти и заменить значения в моем объекте, когда они соответствуют регулярному выражению (например, **myVar**); Объект, который мне нужно прокрутить, определяется пользователем, а структура меняется.
Вот пример объекта, сокращенный для простоты.
var testObject = {
name: "/pricing-setups/{folderId}",
method: "POST",
endpoint: "/pricing-setups/:folderId",
functionName: "create",
Consumes: null,
filename: "apicontracts/pricingsetups/PricingSetupServiceProxy.java",
pathParam: [
{$$hashKey: "06S",
key: "folderId",
value: "**myVar**"}
],
queryParam: [],
request_payload: "{'title':'EnterAname'}",
returnList: []
}
Этот объект передается в основную функцию, которая создает объект ресурса angularjs, используя переданный объект.
Вот структура, которую я использую:
function getTestResult(dataSource, options) {
//input into the service should be api obj and selected environment obj
//extend the passed object with options if passed
var opts = $.extend({}, dataSource, options);
//swap the {param} syntax for :param in opts.endpoint
opts.endpoint = opts.endpoint.replace(/\}/g, "").replace(/\{/g, ":");
//replace any defined vars passed in from scenario via scenario.userVar
opts = replaceUserVars(opts, {"myVar": "C=1000=Corporate"});
//MORE CODE STUFF
// ...
// ...
}
replaceUserVars() основан на следующих вопросах/ответах, но мой случай отличается, потому что изменится структура переданного объекта (var testObject) и местоположение найденного совпадения.
- Массив объектов JSON внутри массива найти и заменить в javascript а>
- Как перебрать все ключи и значения вложенного объекта?
- Обход всех узлов дерева объектов JSON с помощью JavaScript
ТАК... Вот мое рекурсивное решение, чтобы найти значения, соответствующие желаемому регулярному выражению
function replaceUserVars(api, uvars) {
if (!uvars) {
return api;
}
var pattern = new RegExp("\\*\\*\\w*\\*\\*", "g");//match **myVar**
//check the api params for a match to regex
// and if we find a match, replace the string with the userVar[regex match].value
function warpSpeedAhead(collection) {
_.find(collection, function (obj) { //find obj in api
if (obj !== null && typeof(obj) === "object") {
warpSpeedAhead(obj);
}
else {
if (pattern.test(obj)) { //check the regex
var sanitVar = obj.replace(/\*/g, ""); //remove the *
if (uvars[sanitVar]) {
console.log("found one");
obj = uvars[sanitVar];
//should be equivalent to
//api.pathParam[0][key] = uvars[sanitVar]; //works in this case ONLY
}
}
}
});
}
warpSpeedAhead(api);
return api;
}
Эта функция успешно находит значения, соответствующие регулярному выражению, однако я не могу вернуть обновленный объект без прямого обращения к структуре testObject.
Вот jsfiddle кода выше. http://jsfiddle.net/joshvito/2Lu4oexj/3/
Моя цель состоит в том, чтобы иметь возможность искать во входящем объекте, находить любые значения, соответствующие регулярному выражению, и изменять значение на значение, определенное в userVars (если значение объекта и ключ userVar совпадают).