У меня проблема с проверкой / получением / заменой многих глубоко вложенных значений, и я не уверен, как лучше это сделать.Мне также нужно, чтобы это было модульным, так как будут появляться новые объекты с разными путями.
Вот несколько примеров путей, с которыми мне приходится иметь дело:
"paths": [
{
"masterItemIdPath": "gaLayers[m].size.expression.key",
"masterItemCheck": "gaLayers[m].size.expression.type == 'libraryItem'",
"measurePath": "gaLayers",
"measureDefPath": "gaLayers[m].size.expression.key",
},
{
"masterItemIdPath": "gaLayers[m].color.byMeasureDef.key",
"masterItemCheck": "gaLayers[m].color.byMeasureDef.type == 'libraryItem'",
"measurePath": "gaLayers",
"measureDefPath": "gaLayers[m].color.byMeasureDef.key",
},
{
"masterItemIdPath": "gaLayers[m].qHyperCubeDef.qDimensions[secondLoop].qAttributeExpressions.qLibraryId",
"masterItemCheck": "gaLayers[m].qHyperCubeDef.qDimensions[secondLoop].qAttributeExpressions.qLibraryId.length > 1",
"measurePath": "gaLayers",
"measureDefPath": "gaLayers[m].qHyperCubeDef.qDimensions[secondLoop].qAttributeExpressions.qExpression",
"secondLoop": true,
"measurePath2": "gaLayers[m].qHyperCubeDef.qDimensions"
},
{
"masterItemIdPath": "qHyperCubeDef.qMeasures[m].qLibraryId",
"masterItemCheck": "qHyperCubeDef.qMeasures[m].qLibraryId.length >1",
"measurePath": "qHyperCubeDef.qMeasures",
"measureDefPath": "qHyperCubeDef.qMeasures[m].qDef.qDef",
"secondLoop": false
}
],
Что мне нужно сделать, это следующее (взяв в качестве примера последний объект пути):
- Убедитесь, что объект имеет допустимый путь меры (qHyperCubeDef.qMeasures)
- Проверьте, не является ли «masterItemCheck»: qHyperCubeDef.qMeasures [m] .qLibraryId.length> 1 истинным.для каждого элемента в массиве qHyperCubeDef.qMeasures
- На основе результата шага 2 я вызову либо функцию a, либо b, чтобы получить значение, а затем установлю measureDefPath с результатом этой функции
Вы можете видеть, что становится довольно сложно, конечно, когда мне иногда приходится делать циклы внутри циклов для некоторых путей, но не для других.
В данный момент я делаю следующее, но это очень сложноследовать и не очень модульно на всех и на данный момент не дает правильных результатов:
function getAndSetMeasures(vizProp, dimName, dimValue, paths) {
var masterItemIdPath = paths.masterItemIdPath;
var masterItemCheck = paths.masterItemCheck;
var measurePath = paths.measurePath;
var measureDefPath = paths.measureDefPath;
var loop = paths.secondLoop;
var measurePath2 = paths.measurePath2;
var vizProp = JSON.parse(JSON.stringify(vizProp));
return new Promise(function (resolve, reject) {
try {
if (eval('vizProp.' + measurePath + '.length') > 0) {
// Loop through measures
var promises = [];
for (var m = 0; m < eval('vizProp.' + measurePath + '.length'); m++) {
if (loop) {
for (var secondLoop = 0; secondLoop < eval('vizProp.' + measurePath2 + '.length'); secondLoop++) {
try {
// Get Measure Definition from master item
if (eval("vizProp." + masterItemCheck)) {
var promise = getMasterMeasure(eval('vizProp.' + masterItemIdPath));
promises.push(promise);
}
// Otherwise get the def from hypercube
else {
var promise = eval('vizProp.' + measureDefPath);
promises.push(promise);
}
}
catch (err) {
console.log(err);
promises.push("no action");
}
}
}
else {
try {
// Get Measure Definition from master item
if (eval("vizProp." + masterItemCheck)) {
var promise = getMasterMeasure(eval('vizProp.' + masterItemIdPath));
promises.push(promise);
}
// Otherwise get the def from hypercube
else {
var promise = eval('vizProp.' + measureDefPath);
promises.push(promise);
}
}
catch (err) {
console.log(err);
promises.push("no action");
}
}
}
// All measures received from promises
Promise.all(promises).then(function (measures) {
// Create modifed measures
var mesPromises = [];
for (var m = 0; m < measures.length; m++) {
if (measures[m] != 'no action') {
var mesPromise = createMeasure(measures[m], dimName, dimValue)
mesPromises.push(mesPromise);
}
else {
mesPromises.push(measures[m]);
}
}
// Set measures within props
Promise.all(mesPromises).then(function (measures) {
for (var m = 0; m < eval('vizProp.' + measurePath + '.length'); m++) {
if (measures[m] != 'no action') {
eval('vizProp.' + masterItemIdPath + " = '';");
eval('vizProp.' + measureDefPath + " = measures[m];");
}
}
resolve(vizProp);
})
})
}
else {
resolve(vizProp);
}
}
catch (err) {
reject(err);
}
})
}
```