javascript - 如何合并多个多维JSON文件?

标签 javascript jquery arrays json object

我正在尝试将多个 JSON 对象合并为一个,但我很难弄清楚如何获得所需的结果。

我不太擅长创建复杂的 for 循环,这阻碍了我的成功。

示例area1.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -5.555,
                            precip-intensity: 0,
                            wind-dir: 90.25001,
                            temperature: 3.7924042,
                            wind-speed: 8.692518,
                            weather-symbol: 3,
                            pressure-sealevel: 100247.5
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0,
                            wind-dir: 89.87501,
                            temperature: 3.1674042,
                            wind-speed: 8.731581,
                            weather-symbol: 3,
                            pressure-sealevel: 100238.5
                        }
                    ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -5.555,
                            precip-intensity: 0.00390625,
                            wind-dir: 97.500015,
                            temperature: 3.6734467,
                            wind-speed: 8.874923,
                            weather-symbol: 3,
                            pressure-sealevel: 100265.625
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0.00390625,
                            wind-dir: 96.000015,
                            temperature: 3.1109467,
                            wind-speed: 9.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100260.625
                        }       
                    ]
                }
            ]
        }

示例area2.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.0078125,
                            wind-dir: 96.25001,
                            temperature: 4.792404,
                            wind-speed: 10.200331,
                            weather-symbol: 3,
                            pressure-sealevel: 100237
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0,
                            wind-dir: 86.50001,
                            temperature: 4.167404,
                            wind-speed: 11.106581,
                            weather-symbol: 3,
                            pressure-sealevel: 100243
                        }
                        ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.03125,
                            wind-dir: 92.625015,
                            temperature: 4.7359467,
                            wind-speed: 11.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100242.125
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0.0078125,
                            wind-dir: 90.750015,
                            temperature: 4.2359467,
                            wind-speed: 11.24211,
                            weather-symbol: 3,
                            pressure-sealevel: 100269.625
                        }           
                        ]
                }
                ]
        }

这将是期望的结果

组合area3.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.0078125,
                            wind-dir: 96.25001,
                            temperature: 4.792404,
                            wind-speed: 10.200331,
                            weather-symbol: 3,
                            pressure-sealevel: 100237
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0,
                            wind-dir: 86.50001,
                            temperature: 4.167404,
                            wind-speed: 11.106581,
                            weather-symbol: 3,
                            pressure-sealevel: 100243
                        },
                        {
                            lon: -5.555,
                            precip-intensity: 0,
                            wind-dir: 90.25001,
                            temperature: 3.7924042,
                            wind-speed: 8.692518,
                            weather-symbol: 3,
                            pressure-sealevel: 100247.5
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0,
                            wind-dir: 89.87501,
                            temperature: 3.1674042,
                            wind-speed: 8.731581,
                            weather-symbol: 3,
                            pressure-sealevel: 100238.5
                        }
                    ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.03125,
                            wind-dir: 92.625015,
                            temperature: 4.7359467,
                            wind-speed: 11.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100242.125
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0.0078125,
                            wind-dir: 90.750015,
                            temperature: 4.2359467,
                            wind-speed: 11.24211,
                            weather-symbol: 3,
                            pressure-sealevel: 100269.625
                        },          
                        {
                            lon: -5.555,
                            precip-intensity: 0.00390625,
                            wind-dir: 97.500015,
                            temperature: 3.6734467,
                            wind-speed: 8.874923,
                            weather-symbol: 3,
                            pressure-sealevel: 100265.625
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0.00390625,
                            wind-dir: 96.000015,
                            temperature: 3.1109467,
                            wind-speed: 9.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100260.625
                        }       
                    ]
                }
            ]
        }

这个帖子的答案已经差不多了…… Merge JSON Data by Key

我尝试使用这段代码...

        function mergeJson(target) {
            for (var argi = 1; argi < arguments.length; argi++) {
                var source = arguments[argi];
                for (var key in source) {
                    if (!(key in target)) {
                        target[key] = [];
                    }
                    for (var i = 0; i < source[key].length; i++) {
                        target[key].push(source[key][i]);
                    }
                }
            }
            return target;
        }


        var finalJson = mergeJson({}, area1, area2);

这给了我两个数组...

最佳答案

您复制粘贴了执行不同合并的代码片段。给定的合并会:

{ a: [1, 2] } + { a: [3] } = { a: [1, 2, 3] }

您的数据格式需要更复杂的合并:

{ data: [ { key: "a", values: [1, 2] } ] } + 
{ data: [ { key: "a", values: [3] } ] } =
{ data: [ { key: "a", values: [1, 2, 3] }

放开第一个 block 的逻辑,您将得到:

 { data: [ { key: "a", values: [1, 2] },
           { key: "a", values: [3] } ] }

正如您所说,这不是您想要的。

此比较应该清楚地表明,您需要找到一种方法来收集类似值(采用您的格式的日期)的数据,然后才能开始合并

这是一个示例实现,其中包含使用您提供的代码片段时的预处理任务。代码在注释中有解释。

var area1={data:[{date:"2018031300",p:[{lon:-5.555},{lon:-4.444}]},{date:"2018031301",p:[{lon:-5.555},{lon:-4.444}]}]},area2={data:[{date:"2018031300",p:[{lon:-7.777},{lon:-6.666}]},{date:"2018031301",p:[{lon:-7.777},{lon:-6.666}]}]};


const mergeAreas = (area1, area2) => {
  // Skip the part of the structure that's always the same:
  const vals1 = area1.data;
  const vals2 = area2.data;
  
  // to { [date]: points }
  const valObj1 = arrayToObject(x => x.date, x => x.p, vals1);
  const valObj2 = arrayToObject(x => x.date, x => x.p, vals2);
  
  // Merge using the strategy you provided:
  const mergedObj = mergeJson({}, valObj1, valObj2);
  
  // Go back to the original format: [ { date, p } ]
  const mergedData = objToArray(([date, p]) => ({ date, p }), mergedObj);
  
  // Wrap it back up in the base structure: { data: [ ] }
  return {
    data: mergedData
  }

};

// Takes an array of items and returns a single object.
// The items are stored in a key returned by `getKey`
// The items are represented by a value returned by `getValue`
// When `getKey` returns duplicates, it overwrites the previous entry
function arrayToObject(getKey, getValue, xs) {
  return xs.reduce(
    (acc, x) => Object.assign(acc, { [getKey(x)]: getValue(x) }),
    {}
  );
};

// This takes an object and returns an array based on its entries
function objToArray(kvpToItem, obj) {
  return Object.entries(obj).map(kvpToItem);
}

// Provided by OP from answer https://stackoverflow.com/a/16302909/3297291
function mergeJson(target) {
  for (var argi = 1; argi < arguments.length; argi++) {
    var source = arguments[argi];
    for (var key in source) {
      if (!(key in target)) {
        target[key] = [];
      }
      for (var i = 0; i < source[key].length; i++) {
        target[key].push(source[key][i]);
      }
    }
  }
  return target;
}

// Run with example data
var finalJson = mergeAreas(area1, area2);
console.log(finalJson);

关于javascript - 如何合并多个多维JSON文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274115/

相关文章:

javascript - 我的数组中的值不会在 DOM 中呈现

ios - 无法从阵列中获取正确的音频文件来播放

javascript - 不工作 : Code to send email reminder based on date

javascript - 替换变量中的特定字符 - jquery

javascript - 动态 .length jquery 函数

javascript - 闪存 fscommands 和 javascript

java - 使用 RingoJs 模拟浏览器

javascript - 如何使用javascript根据动态表每行中的输入值添加天数

jquery - Localstorage to JSON : How can I delete only 1 array inside a key since localstorage. remove Item 需要整个key

c - 二维数组问题