2015-01-31 2 views
0

Мой вопрос основан на том, как объединить данные из одного объекта JS в другой объект JSON, чтобы заменить его текущее значение, сопоставив его с ключом и значением от другого объекта.Заменить значение ключа массива/объектов с помощью значения ключа из другого массива/объекта javascript

В этом примере я х и у которые просто дает дату и номер. Однако у меня также есть 3 других ключа, значение которых является ключом в другом объекте в приведенном ниже примере. Эти ключи:

  • pf
  • nf
  • t

Цель состоит в том, чтобы либо изменить текущий объект JSON, заменив значение со значением ключей соответствовать или создания нового объекта JSON весь с той же заменой. Единственное другое предостережение в том, что иногда значения исходного объекта с нулевым значением, а в тех случаях они должны оставаться нулевыми после слияния или создания нового JSON.

 var data = [ 

       {x: Date.UTC(2014,8,1), y: 730, pf:["001","002"], nf:["001","002"], t:["001","002"] }, 
       {x: Date.UTC(2014,10,1), y: null, pf:null, nf:null, t:null}, 
        ] 


     var pfMap={ 
      "001":{"sd":"short desc1", "ld":"long desc1"}, 
      "002":{"sd":"short desc2", "ld":"long desc2"} 
     } 

     var nfMap={ 
      "001":{"sd":"short desc1", "ld":"long desc1"}, 
      "002":{"sd":"short desc2", "ld":"long desc2"} 
     } 

     var tMap={ 
      "001":"tip text1", 
      "002":"tip text2" 
     } 

Так как пример новый объект JSON будет иметь массив ключей два результата или нуль, если ничего не есть. Перехват это имеет смысл.

ответ

1

 var data = [ 
 

 
       {x: Date.UTC(2014,8,1), y: 730, pf:["001","002"], nf:["001","002"], t:["001","002"] }, 
 
       {x: Date.UTC(2014,10,1), y: null, pf:null, nf:null, t:null}, 
 
        ] 
 

 

 
     var pfMap={ 
 
      "001":{"sd":"short desc1", "ld":"long desc1"}, 
 
      "002":{"sd":"short desc2", "ld":"long desc2"} 
 
     } 
 

 
     var nfMap={ 
 
      "001":{"sd":"short desc1", "ld":"long desc1"}, 
 
      "002":{"sd":"short desc2", "ld":"long desc2"} 
 
     } 
 

 
     var tMap={ 
 
      "001":"tip text1", 
 
      "002":"tip text2" 
 
     } 
 
      
 
      
 
     //recursion 
 
      
 
     function traverseData(data, elementName) 
 
     { 
 
      var keys = Object.keys(data); 
 
      for (var i = 0; i < keys.length; ++i) 
 
      { 
 
       if (Object.prototype.toString.call(data[keys[i]]) == "[object Object]" || Object.prototype.toString.call(data[keys[i]]) == "[object Array]") 
 
       { 
 
        traverseData(data[keys[i]], keys[i]); 
 
       } 
 
       else 
 
       { 
 
        if (elementName != null && window[elementName + "Map"]) 
 
        { 
 
         data[keys[i]] = window[elementName + "Map"][data[keys[i]]];   
 
        }              
 

 
       } 
 

 
      } 
 
       
 
     } 
 
      
 
     traverseData(data, "data"); 
 
     document.write(JSON.stringify(data)); 
 
    

Это рекурсивная функция будет делать трюк. Он игнорирует значения null. В противном случае, когда объект является строкой и соответствует одному из объектов карты, он заменит значение. Вы можете пойти n уровней с этой функцией.

+0

Это похоже на то, что мне нужно. В интересах обучения я все еще не уверен, как функция знает о трех других объектах. Я вижу, что вы передаете исходные данные var, но я не вижу ссылки на другие три. Что мне здесь не хватает? –

+0

'window [elementName +" Map "]' Эти три части глобальной области. Поэтому, если код обнаруживает, что имя родительского объекта совпадает с именем одного из этих объектов, кроме выполнения. Он динамически строится и протестирован против оконного объекта: фактически он становится «window ['xMap»], который оценивается как false или 'window [' pfMap ']', который оценивается как истинный. – Mouser

+0

Блестящее спасибо! –

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