将数组/对象键值替换为来自另一个数组/对象javascript的键值

时间:2015-01-31 23:04:12

标签: javascript arrays json object mapping

我的问题是基于如何将来自一个JS对象的数据合并到另一个JSON对象中,以便通过将其映射到另一个对象的键和值来替换其当前值。

在此示例中,我有 x y ,它们只是提供日期和数字。但是,我还有3个其他键,其值是下面示例中另一个对象中的键。这些键是:

  • pf
  • nf
  • t

目标是通过用匹配键值替换值来修改当前的JSON对象,或者使用相同的替换创建一个新的JSON对象。唯一的另一个警告是,有时原始对象的值为null,在这些情况下,它们应该在合并或创建新JSON后保持为null。

        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对象将具有两个结果的键数组,如果没有,则为null。跳跃这是有道理的。

1 个答案:

答案 0 :(得分: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));
         
&#13;
&#13;
&#13;

这个递归函数可以解决这个问题。它会忽略null个值。否则,当对象是字符串并匹配其中一个地图对象时,它将替换该值。您可以使用此功能深入n级别。