Корректная реорганизация массива JSON в JS - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть строка JSON, аналогичная приведенной ниже:

[
    {"id":"112233","region":"UK","city":"London","name":"Company 1"},
    {"id":"112244","region":"UK","city":"London","name":"Company 2"},
    {"id":"112255","region":"UK","city":"Manchester","name":"Company 3"},
    {"id":"112266","region":"UK","city":"Manchester","name":"Company 4"}
]

Я пытаюсь перестроить это в массив JS, например:

[
    { 
        ["London"]: [
                    ["112233"] : [{"id":"112233","region":"UK","city":"London","name":"Company 1"}],
                    ["11224"] : [{"id":"112244","region":"UK","city":"London","name":"Company 2"}],
                ],
        ["Manchester"]: [
                    ["112255"] : [{"id":"112255","region":"UK","city":"Manchester","name":"Company 3"}],
                    ["112266"] : [{"id":"112266","region":"UK","city":"Manchester","name":"Company 4"}]
                ]
    }
]

Вот код, который яЯ использую для этого:

var company = [];
var companies = [];
var cities = [];

// generate citites
for (var i = 0; i < dump.length; i++)
{
    // check if city exits
    if(!cities.includes(dump[i].city.trim())) {
        cities[dump[i].city.trim()] = companies;
    }
}

// add companies
for (var i = 0; i < dump.length; i++)
{
    company['company_name'] = dump[i].company_name;
    company['region'] = dump[i].region;
    cities[dump[i].city][dump[i].id] = company;
}
console.log(cities);

Теперь я получаю сообщение об ошибке Cannot set property '112233' of undefined TypeError: Cannot set property '112233' of undefined.

Может кто-нибудь объяснить, что я делаю неправильно?

1 Ответ

0 голосов
/ 30 сентября 2018

Форматирование желаемых результатов немного странно, потому что вы используете [] для того, что выглядит как объекты с ключами.Я предполагаю, что это опечатки и что вы действительно хотите объект.

Вот простой способ сделать это с помощью reduce():

let dump = [
    {"id":"112233","region":"UK","city":"London","name":"Company 1"},
    {"id":"112244","region":"UK","city":"London","name":"Company 2"},
    {"id":"112255","region":"UK","city":"Manchester","name":"Company 3"},
    {"id":"112266","region":"UK","city":"Manchester","name":"Company 4"}
]

let obj = dump.reduce((obj, item) => {
    let city = obj[item.city] || (obj[item.city] = {}) // add city obj to object if not there.
    city[item.id] = item                               // add item.id to city obj
    return obj
}, {})
console.log(obj)

РЕДАКТИРОВАТЬ:

Способ reduce() работает, чтобы начать со значения, которое передается во втором параметре, здесьэто пустой объект {}, который называется obj в обратном вызове, а затем перебирает массив (dump).С каждой итерацией мы смотрим и видим, есть ли у этого obj свойство с именем текущего элемента в итерации.Если нет, добавьте его и назначьте новый объект {}.Затем с этим объектом в руке добавьте свойство, соответствующее item.id и добавив к нему целое item.

Вы можете написать все это как цикл for, но reduce довольно лаконичен - просто нужно время, чтобы привыкнуть к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...