Извлечение свойств и уникальных значений из коллекции GeoJson - PullRequest
1 голос
/ 11 июля 2019

Вот объект geojson, который имеет массив объектов, у каждого объекта есть объект properties.

Я понимаю, что есть много вопросов, связанных с массивами карт и объектами, но я не смог найти подобный случай. Я попытался использовать lodash map и groupBy для сопоставления свойств и группировки значений по их key, но, честно говоря, я просто не знаю, какой должна быть комбинация функций.

Я могу получить часть имени свойства, выполнив следующее:

// since properties are the same for all features
// I extract them alone first

let properties = Object.keys(features[0].properties)

properties.map(Prentelement =>
{
    let formated = {
        // this gives me the first part
        propertyName: Prentelement,

        // I can't figure out this part to map the values uniquely under
        children: [
          {
            value: "alex"
          },
          {
            value: "cairo"
          }
        ]
    }

    return formated;
})

Это пример формата ввода:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "Name": "cairo",
        "Type": "Province"
      }
    },
    {
      "type": "Feature",
      "properties": {
        "Name": "alex",
        "Type": "Province"
      }
    }
  ]
}

И что я хочу сделать, это своего рода сводка по каждому доступному свойству и его возможным значениям для различных функций. Обратите внимание, что значение может быть повторено для всех функций, но я хочу, чтобы оно было доступно только один раз в конечном результате. Таким образом, результатом будет такой массив:

[
  {
    propertyName: "Name",
    children: [
      {value: "alex"},
      {value: "cairo"}
    ]
  },
  {
    propertyName: "Type",
    children: [
      {value: "Province"}
    ]
  }
]

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Другой подход (используя те же входные данные, которые предоставляет @Shidersz):

     const result = input.features.reduce((acc, feature) => { 
             Object.keys(feature["properties"]).forEach(key => {
                 const index = acc.findIndex(property => {
                     return property["propertyName"] === key })

                 if (index === -1) {
                      acc.push({ propertyName: key, children: [ { value: feature["properties"][key]}] })
                 } else {
                      if (acc[index].children.findIndex(child => child.value === feature["properties"][key]) === -1) {
                        acc[index].children.push({ value: feature["properties"][key] })
                      }

                 }
             })

          return acc;

      }, []);

     console.log(JSON.stringify(result));
1 голос
/ 11 июля 2019

Здесь у вас есть одно решение, использующее первый Array.reduce () для группировки массива features по свойствам объекта.Обратите внимание, что мы используем Sets , чтобы сохранить только уникальные значения.Позже, на втором шаге, мы можем Array.map () entries ранее сгенерированного объекта, чтобы получить желаемую структуру:

let input = {
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {"Name": "cairo", "Type": "Province"}
    },
    {
      "type": "Feature",
      "properties": {"Name": "alex", "Type": "Province"}
    }
  ]
};

// Step 1, group feature values by property.

let out = input.features.reduce((acc, {properties}) =>
{
    Object.entries(properties).forEach(([key, val]) =>
    {
        acc[key] = acc[key] || new Set();
        acc[key].add(val);
    });

    return acc;
}, {});

// Show the generated object on Step 1.

console.log("Step 1 - After grouping:", out);

for (const key in out)
{
    console.log(`${key} => ${[...out[key]]}`);
}

// Step 2, map the entries of the generated object.

out = Object.entries(out).map(([k, v]) =>
    ({PropertyName: k, Children: [...v].map(x => ({Value: x}))})
);

console.log("Step 2 - After mapping:", out);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Другая документация, которую вам может понадобиться прочитать:

...