Функция, которая сравнивает два объекта и назначает значение свойства старого объекта новому значению объекта, если новое значение пусто или равно нулю? - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь убедиться, что любые существующие, ненулевые или пустые значения не перезаписываются пустыми или нулевыми значениями из вызова API.

Например, предположим, что

originalReference['data']['articleTitle'] = 'Something or other';

и

reference['data']['articleTitle'] = '';,

, где reference - этообъект, который вернулся из API, и originalReference - это объект, который существовал до вызова API (был загружен из базы данных MySQL).

Я хочу убедиться, что эта функция циклически проходит эти сложные объекты (оба должны всегдаиметь одинаковую длину и одинаковые имена свойств) и переназначает старое значение новому объекту.

Итак, в приведенном выше случае использования после выполнения функции articleTitle в объекте reference будет иметь вид:

reference['data']['articleTitle'] = 'Something or other';

Вотчто у меня пока что:

if (referenceLength == originalReferenceLength) {
    try {
        for (var prop in reference) {
            // First check for undefined or null
            if (reference[prop] != undefined) {
                if (reference[prop] != null) {
                    if (typeof reference[prop] == 'string' && reference[prop].trim() == '') {
                        // Assign original value to new object if new value is empty string
                        reference[prop] = originalReference[prop];
                    }

                    // Check if current prop in both objects is an object
                    if (typeof reference[prop] == 'object' && typeof originalReference[prop] == 'object') {
                        for (var property in reference[prop]) {
                            // Check for undefined or null value in original
                            if (originalReference[prop][property] != undefined) {
                                if (originalReference[prop][property] != null) {
                                    if (reference[prop][property] == null || reference[prop][property] == '') {
                                        // Assign old non-null value to new object if new value is empty or null
                                        reference[prop][property] = originalReference[prop][property];
                                    }
                                }
                            }
                        }
                    }

                    if (Array.isArray(reference[prop]) && typeof Array.isArray(originalReference[prop])) {
                        // Recurse if both are arrays
                        reference[prop].forEach((item, index) => vm.evaluateEmptyValues(item, originalReference[prop][index]));
                    }
                } else {
                    if (originalReference[prop] != undefined) {
                        if (originalReference[prop] != null) {
                            // Assign original value to new object
                            reference[prop] = originalReference[prop];
                        }
                    }
                }
            } else {
                if (originalReference[prop] != undefined) {
                    if (originalReference[prop] != null) {
                        // Assign original value to new object
                        reference[prop] = originalReference[prop];
                    }
                }
            }
        }
    } catch(err) {
        console.log(err);
    }
}

1 Ответ

0 голосов
/ 22 апреля 2019

Не думайте, что с этим что-то не так, но это может быть много СУШКА и более многоразового использования.

Специально итерация реквизита, который сам по себе является объектом, просто кричит о рекурсии, поэтому здесь возможен рефакторинг:

function mergeNewReference(origRef, newRef, enforceSameProps=true){
  if(!newRef){
    console.log('newRef is empty, not sure what should happen')
  }else if(enforceSameProps && origRef.length != newRef.length){
     console.log('Objects have different length, not sure what should happen');
  }else{
    for(prop in newRef){
      var newVal = newRef[prop];
      if(!isNullOrUndefined(newVal)){
        var origVal = origRef[prop];
        if(isNullOrUndefined(origVal) || isEmptyString(origVal)){
          origRef[prop] = newVal;
        }else if(typeof newVal == typeof origVal && typeof newVal[Symbol.iterator] === 'function'){
          mergeNewReference(origVal, newVal, false)
        }
      }
    }
  }
  return origRef;
}

//These helper methods could be better encapsulated inside the merge method. 
//I'll leave them here for better readability
function isNullOrUndefined(val){
  return val == null || val == undefined;
}
function isEmptyString(str){
  return typeof str == 'string' && str.trim() == ''
}

ВНИМАНИЕ: это вернет другой результат из вашего алгоритма, если вы вложилиобъекты с более чем одним уровнем, поскольку это делает глубокое слияние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...