GroupBy массив объектов - PullRequest
0 голосов
/ 11 июля 2020

У меня есть этот массив объектов

[
  {
    "countryCode": "US",
    "countryName": "United States",
    "stateId": "1",
    "stateName": "Alabama",
    "cityId": "1",
    "cityName": "Montgomery"
  },
  {
    "countryCode": "US",
    "countryName": "United States",
    "stateId": "2",
    "stateName": "Alabama",
    "cityId": "2",
    "cityName": "Birmingham"
  },
  {
    "countryCode": "US",
    "countryName": "United States",
    "stateId": "2",
    "stateName": "Alaska",
    "cityId": "1",
    "cityName": "Anchorage"
  }
]

, которые я хотел бы преобразовать в объект, подобный следующему

{
  "countryCode": "US",
  "countryName": "United States",
  "states": [
    {
      "stateId": 1,
      "stateName": "Alabama",
      "cities": [
        {
          "cityId": 1,
          "cityName": "Montgomery"
        },
        {
          "cityId": 2,
          "cityName": "Birmingham"
        }
      ]
    },
    {
      "stateId": 2,
      "stateName": "Alaska",
      "cities": [
        {
          "id": 1,
          "name": "Anchorage"
        }
      ]
    }
  ]
}

Я пробовал loda sh 's groupBy как var grouped = _.groupBy(data, 'countryCode'), но я получил

{
  HN: [
    {
      countryCode: 'US',
      countryName: 'United States',
      stateId: '1',
      stateName: 'Alabama',
      cityId: '1',
      cityName: 'Montgomery'
    },
    {
      countryCode: 'US',
      countryName: 'United States',
      stateId: '1',
      stateName: 'Alabama',
      cityId: '2',
      cityName: 'Birmingham'
    },
    {
      countryCode: 'US',
      countryName: 'United States',
      stateId: '2',
      stateName: 'Alaska',
      cityId: '1',
      cityName: 'Anchorage'
    }
  ]
}

Я не хочу, чтобы значение имени свойства, в котором будут сгруппированы данные, было ключом, я хочу, чтобы имя свойства было сгруппировано by, чтобы установить его в качестве ключа, а затем создать настраиваемое свойство в виде массива для перечисления всех городов штата, есть ли способ добиться этого?

Спасибо!

1 Ответ

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

Думаю, это то, что вы ищете. Это также почти дубликат Javascript групповых объектов по свойству

x = [{
        "countryCode": "US",
        "countryName": "United States",
        "stateId": "1",
        "stateName": "Alabama",
        "cityId": "1",
        "cityName": "Montgomery"
    },
    {
        "countryCode": "US",
        "countryName": "United States",
        "stateId": "1",
        "stateName": "Alabama",
        "cityId": "2",
        "cityName": "Birmingham"
    },
    {
        "countryCode": "US",
        "countryName": "United States",
        "stateId": "2",
        "stateName": "Alaska",
        "cityId": "1",
        "cityName": "Anchorage"
    }
];

var stateArray = Object.values(x.reduce((result, {
    countryCode,
    countryName,
    stateId,
    stateName,
    cityId,
    cityName
}) => {
    // Create new group
    if (!result[0]) result[0] = {
        countryCode,
        countryName,
        states: []
    };
    // Append to group
    let state = -1;
    for (let i = 0; i < result[0].states.length; i++) {
        if (result[0].states[i].stateId == stateId)
            state = i;
    }
    if (state == -1) {
        result[0].states.push({
            stateId,
            stateName,
            cities: [{
                cityId,
                cityName
            }]
        });
    } else {
        result[0].states[state].cities.push({
            cityId,
            cityName
        });
    }
    return result;
}, {}));

console.log(stateArray)
...