如何将.geojson文件转换为嵌套数组的JavaScript对象?

时间:2017-09-02 01:50:22

标签: javascript jquery json geojson file-conversion

新手在这里,努力将数据转换为复杂的结构。我有一个非常大的.geojson文件,其中包含以下简化数据格式:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "group_name": "AAA",
        "inst_name": "Institution1",
        "holdings": "100,000+",
        "all_titles": "500,000+",
        "region": "New York"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -86.1762,
          39.7742
        ]
      }
    },
  {
  "type": "Feature",
  "properties": {
    "group_name": "AAA",
    "inst_name_long": "Institution2",
    "holdings": "100,000+",
    "all_titles": "500,000+",
    "region": "New York"
  },
  "geometry": {
    "type": "Point",
    "coordinates": [
      -87.4106,
      39.4705
    ]
  }
},...

如何将其转换为以下格式?

[{ 
       inst_name: "Institution1",
       properties: {group_name: "AAA", holdings: "<100,000", all_titles: "250,000+", region: "Indiana"},
       group_name: "AAA",
       group_members: ["Institute1","Institute2,...],
       region_name: "New York",
       region_members: ["Institute1","Institute2,...],
       collection_name: "100,000+",
       collection_members: ["Institute1","Institute2,...],
       shared_name: "500,000+",
       shared_members: ["Institute1","Institute2,...]
},{ 
       inst_name: "Institution2",
       properties: {group_name: "AAA", holdings: "<100,000", all_titles: "250,000+", region: "Indiana"},
       group_name: "AAA",
       group_members: ["Institute1","Institute2,...],
       region_name: "New York",
       region_members: ["Institute1","Institute2,...],
       collection_name: "100,000+",
       collection_members: ["Institute1","Institute2,...],
       shared_name: "500,000+",
       shared_members: ["Institute1","Institute2,...]
}]

我已经能够获得用该对象创建的对象的第一部分 inst_name: "Institution2", properties:{}, 但是我一直试图在同一个函数中构建对象的其余部分,这可以在这个plunker中看到:https://plnkr.co/edit/340oshw78kEAOdFwZpH9?p=preview

1 个答案:

答案 0 :(得分:1)

当您需要处理复杂数据时,将任务细分为较小的可管理块。

- &gt;形成具有简单属性的INSTIT数组。

- &gt;将类似的机构分组到单独的数组中。

- &gt;根据值将机构数组映射到分组数组。

fetch('./geoJsondata.json')
    .then((res)=>res.json())
    .then(handleResponse)
    .catch((err)=>console.log(err))

function handleResponse(res) {
    let propsToGroupBy = ['region', 'all_titles', 'holdings', 'group_name']
    console.log(flattenJSON(res, propsToGroupBy));
    return flattenJSON(res, propsToGroupBy)
}


function flattenJSON(geoJSON, propsToGroupBy) {
    let { institutions, groups } =
        geoJSON.features.reduce(
            reduceGroupsAndGetLists, 
            { institutions: [], groups: {}, groupByProps: propsToGroupBy });
    let flattendJSON = institutions.map(toInstList(groups));

    function reduceGroupsAndGetLists (acc, {properties}) {
        let {
            inst_name_long: inst_name,
            group_name,
            region,
            holdings,
            all_titles
        } = properties;

        acc.institutions.push({
            properties,
            inst_name,
            group_name,
            region,
            holdings,
            all_titles
        });

        acc.groupByProps.map((prop) => {
            if (
                (acc.groups[prop] || (acc.groups[prop] = {})))
                &&
                (
                    acc.groups[prop][properties[prop]] || 
                    (acc.groups[prop][properties[prop]] = [])
                ))
                acc.groups[prop][properties[prop]].push(inst_name);
        });

        return acc;
    }

    function toInstList (groups) {
        return (institution) => {
            propsToGroupBy.map((prop) => {
                institution[`${prop}_members`] = groups[prop][institution[prop]];
            });
            return institution;
        }
    }

    return flattendJSON
}