将 array/objects 键值替换为来自另一个 array/object javascript 的键值
Replace array/objects key value with key value from another array/object javascript
我的问题是基于如何将数据从一个 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。跳跃这是有道理的。
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
级。
我的问题是基于如何将数据从一个 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。跳跃这是有道理的。
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
级。