2014-12-10 3 views
0

Im в настоящее время делает хром-приложение и Im использует локальное хранилище. Затем мой backend возвращает данные JSON, а затем я сохранил это локально, затем зашифровал все элементы внутри этого JSON. Моя проблема в том, что у меня есть разные наборы JSON, а также есть разные функции для шифрования этого.рекурсивная итерация по данным json без известной длины и глубины

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

Мой вопрос: возможно ли это? Если это так, мне нужен рабочий образец.

Кстати, я использую angularJS, и это мой текущий код.

// this function returns a copy of a JSON but with encrypted values. 
    // encrypts objectData using base 64 
    // param -> objectData = data from database (rater and its ratees) 
    fac.encryptData = function(param) { 
     var raterObject = param; 
     var resultObject = { 'ratees':[] }; // final value will be equivalent to raterObject 
     for(property in raterObject) { 
      if(raterObject[property] instanceof Array) { 
       angular.forEach(raterObject[property], function(ratee, rateeKey) { 
        var rateeObject = { 'competencies':[] }; 
        for(property in ratee) { 
         if(ratee[property] instanceof Array) { 
          angular.forEach(ratee[property], function(competency, competencyKey) { 
           var competencyObject = { 'proficiencies':[], 'competencyScoreInfo':[] }; 
           for(property in competency) { 
            if(competency[property] instanceof Array) { 
             if(property == 'proficiencies') { 
              angular.forEach(competency[property], function(proficiency, proficiencyKey) { 
               var proficiencyObject = {}; 
               for(property in proficiency) { 
                if(proficiency[property] == null) { 
                 proficiency[property] = ''; 
                } 
                if(property != '$$hashKey') { 
                 proficiencyObject[property] = base64.encode(proficiency[property].toString()); 
                } else { 
                 proficiencyObject[property] = proficiency[property]; 
                } 
               } 
               competencyObject.proficiencies.push(proficiencyObject); 
              }); 
             } else if(property == 'competencyScoreInfo') { // di pa tapos 
              angular.forEach(competency[property], function(proficiency, proficiencyKey) { 
               var proficiencyObject = { 'indicators':[], 'c1':[], 'c2':[] }; 
               for(property in proficiency) { 
                if(proficiency[property] instanceof Array) { 
                 if(property == 'indicators') { 
                  angular.forEach(proficiency[property], function(indicator, indicatorKey) { 
                   var indicatorObject = {}; 
                   for(property in indicator) { 
                    indicatorObject[property] = base64.encode(indicator[property].toString()); 
                   } 
                   proficiencyObject.indicators.push(indicatorObject); 
                  }); 
                 } else if (property == 'c1') { 
                  angular.forEach(proficiency[property], function(valueC1, c1Key) { 
                   var c1Object = {}; 
                   for(property in valueC1) { 
                    c1Object[property] = base64.encode(valueC1[property].toString()); 
                   } 
                   proficiencyObject.c1.push(c1Object); 
                  }); 
                 } else if (property == 'c2') { 
                  angular.forEach(proficiency[property], function(valueC2, indicatorKey) { 
                   var c2Object = {}; 
                   for(property in valueC2) { 
                    c2Object[property] = base64.encode(valueC2[property].toString()); 
                   } 
                   proficiencyObject.c2.push(c2Object); 
                  }); 
                 } 
                } else { 
                 proficiencyObject[property] = base64.encode(proficiency[property].toString()); 
                } 
               } 
               competencyObject.competencyScoreInfo.push(proficiencyObject); 
              }); 
             } 
            } else { 
             if(property != '$$hashKey') { 
             // if(property != '$$hashKey' && property != 'commentSituationTask' && property != 'commentAction' && property != 'commentResult') { 
              competencyObject[property] = base64.encode(competency[property].toString()); 
             } else { 
              competencyObject[property] = competency[property]; 
             } 
            } 
           } 
           rateeObject.competencies.push(competencyObject); 
          }); 
         } else { 
          if(property != 'currentPage' && property != '$$hashKey') { 
           rateeObject[property] = base64.encode(ratee[property].toString()); 
          } else { 
           rateeObject[property] = ratee[property].toString(); 
          } 
         } 
        } 
        resultObject.ratees.push(rateeObject); 
       }); 
      } else { 
       resultObject[property] = base64.encode(raterObject[property].toString()); 
      } 
     } 
     return resultObject; 
    }; 

У меня есть эта функция для простого шифрования конкретного JSON. Затем у меня есть другая функция шифрования для другого JSON, поэтому я хочу создать динамическую функцию для шифрования различных JSON.

+0

Да, это звучит возможно. Но, пожалуйста, покажите нам код, который вы пробовали, и пример ввода, который не дал ожидаемых результатов. – Bergi

+0

@ Bergi на самом деле, я не пытался его кодировать, но я попытался подумать об этом, и я не могу найти решение. но я отредактирую свой вопрос и добавлю свои текущие коды и их проблемы. –

+1

Я бы просто изложил все это и зашифровал это, чтобы все было сделано быстро без циклов и при сохранении типов. – dandavis

ответ

0

попробовать это:

function encryptData(data) { 
    var encryptedData = null; 
    if (typeof data == 'object') { 
     encryptedData = {}; 
     angular.forEach(data, function (value, key) { 
      encryptedData[key] = encryptData(value); 
     } 
    } else if (data instanceof Array) { 
     encryptedData = []; 
     for (var i = 0; i < data.length; i++) { 
      encryptedData.push(encryptData(data[i])); 
     } 
    } else { 
     encryptedData = base64.encode(data.toString()); 
    } 
    return encryptedData; 
} 
+0

Exlord, извините, но я не буду пытаться ответить. @dandavis дал другой подход к решению моей проблемы, ее намного проще и быстрее. спасибо за Ваш ответ –

Смежные вопросы