Получение и замена вложенных значений в Javascript - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблема с проверкой / получением / заменой многих глубоко вложенных значений, и я не уверен, как лучше это сделать.Мне также нужно, чтобы это было модульным, так как будут появляться новые объекты с разными путями.

Вот несколько примеров путей, с которыми мне приходится иметь дело:

"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
                }
            ],

Что мне нужно сделать, это следующее (взяв в качестве примера последний объект пути):

  1. Убедитесь, что объект имеет допустимый путь меры (qHyperCubeDef.qMeasures)
  2. Проверьте, не является ли «masterItemCheck»: qHyperCubeDef.qMeasures [m] .qLibraryId.length> 1 истинным.для каждого элемента в массиве qHyperCubeDef.qMeasures
  3. На основе результата шага 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);
            }
        })
    }
```
...