我是Javascript的初学者,所以请放弃这个可能是愚蠢的问题。我想基于唯一对象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中的元素顺序不同,并且第二个Json中的元素不存在于第二个中。
结果应如下所示:
"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}}}
答案 0 :(得分:1)
这将完成这项工作:
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()逐个运行'features'数组。
然后我们在features2数组上使用Array.filter(),它为我们提供了一个数组,其中包含features2(匹配[0])中唯一与object.id具有相同ID的对象。
如果匹配,那么我们使用'for in'循环遍历features2对象中的'properties'并将它们复制到'feature'对象。
如果您想获得有关此问题的高级信息,请查看此stackoverflow问题:How can I merge properties of two JavaScript objects dynamically?。例如,如果您正在编写防弹javascript,则应在for循环中使用'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];
}
}
}
}