我是Java语言的初学者,所以请原谅这个可能很愚蠢的问题。我想基于唯一的对象ID合并两个json文件。
第一位看起来像这样:
"features": [{
"id": "3876802",
"properties": {
"name": "some name",
"facts": "some facts"}},
{"id": "3876803",
"properties": {"name":"another name"...}}...]
第二个看起来像这样:
"features": [{
"id": "3876803",
"properties": {
"description": "some description",
"website": "afancywebsite"}},
{"id": "3876803",
"properties": {...}}]
第二个Json中的Elements顺序不相同,并且第一个文件中的所有元素都不都在第二个中。
结果应如下所示:
"features": [{
"id": "3876802",
"properties": {
"name": "some name",
"facts": "some facts"}},{
"id": "3876803",
"properties": {
"name":"another name",
"description": "some description",
"website": "afancywebsite"}}]
我开始对此进行编码,但我不知道如何使其工作。
for(var i in json1.features){
for (var z in json2.features){
if (json1.features[i].id===json2.features[z].id){
json1.feature[i].properties = json2.features[z].properties}}}
最佳答案
这将完成工作:
var features = [
{"id": "3876802",
"properties": {
"name": "some name",
"facts": "some facts"}
},
{"id": "3876803",
"properties": {
"name":"another name"
}
}
];
var features2 = [{
"id": "3876803",
"properties": {
"description": "some description",
"website": "afancywebsite"
}
}
];
features.map(function(feature){
var matchedArray = features2.filter(function(feature2){
return feature2.id === feature.id;
});
if(matchedArray && matchedArray[0]){
for(var attr in matchedArray[0].properties){
feature.properties[attr] = matchedArray[0].properties[attr];
}
}
});
我们首先使用Array.map()逐一运行“功能”数组。
然后,在features2数组上使用Array.filter(),这将为我们提供一个数组,其中包含features2中唯一的对象(matched [0]),该对象的ID与feature.id相同。
如果匹配,则使用“ for in”循环遍历features2对象中的“ properties”,然后将其复制到“ feature”对象。
如果要获取有关此内容的高级信息,请查看以下stackoverflow问题:How can I merge properties of two JavaScript objects dynamically?。例如,如果您正在编写防弹JavaScript,则应在for in循环中使用“ hasOwnProperty”。
您可能还想防止'features2'中的属性覆盖'features'中具有相同名称的属性。
但是,如果您希望保留或多或少的代码,也可以这样做:
for(var i in features){
for (var z in features2){
if (features[i].id===features2[z].id){
for(var attr in features2[z].properties){
features[i].properties[attr] = features2[z].properties[attr];
}
}
}
}