уменьшить функцию в приложении node.js, исключая данные json json, и это слишком громоздко - PullRequest
0 голосов
/ 14 мая 2019

У меня есть этот json в переменной customer:

{
    "customers": [
        {
            "id": 6,
            "name": "Joe Bloggs",
            "email": "joe@bloggs.com",
            "supplier_id": 1,
            "title": "First Supplier",
            "code": "firstsupplier"
        },
        {
            "id": 7,
            "name": "Paul",
            "email": "paul@hotmail.com",
            "supplier_id": 1,
            "title": "First Supplier",
            "code": "firstsupplier"
        },
        {
            "id": 7,
            "name": "Paul",
            "email": "paul@hotmail.com",
            "supplier_id": 3,
            "title": "New Supplier",
            "code": "new"
        },
        {
            "id": 7,
            "name": "Paul",
            "email": "paul@hotmail.com",
            "supplier_id": 4,
            "title": "PC supplier 3",
            "code": "PC03"
        },
        {
            "id": 8,
            "name": "John Doe",
            "email": "john@doe.com",
            "supplier_id": 1,
            "title": "First Supplier",
            "code": "firstsupplier"
        }
    ]
}

Я хочу изменить его так, чтобы он выглядел так:

{
    "customers": [
        {
            "id": 6,
            "name": "Joe Bloggs",
            "email": "joe@bloggs.com",
            "suppliers": [
              {
                "supplier_id": 1,
                "title": "First Supplier",
                "code": "firstsupplier"            
              }
            ]
        },
        {
            "id": 7,
            "name": "Paul",
            "email": "paul@hotmail.com",
            "suppliers": [
              {
                "supplier_id": 1,
                "title": "First Supplier",
                "code": "firstsupplier"
              },
              {
                "supplier_id": 3,
                "title": "New Supplier",
                "code": "new"
              },
              {
                "supplier_id": 4,
                "title": "PC supplier 3",
                "code": "PC03"
              }
            ]
        },
        {
            "id": 8,
            "name": "John Doe",
            "email": "john@doe.com",
            "suppliers": [
              {
                "supplier_id": 1,
                "title": "First Supplier",
                "code": "firstsupplier"            
              }
            ]
        }
    ]
}

Мне удалось получить части этогоработать индивидуально, но я не могу заставить все это работать в одной функции.

Например, я могу создать массив suppliers, но в случае идентификатора клиента 7 в списке появляется только один поставщик.массив.

let customers = await query.offset(offset).limit(limit);

customers = customers.reduce((accumulator, item) => {
  if (accumulator[item.id]) {
    const group = accumulator[item.id];
    group.suppliers = [];
    group.suppliers.push({
      id: item.supplier_id,
      code: item.code,
      title: item.title
    });
  } else {
    accumulator[item.id] = item;
    accumulator[item.id].suppliers = [];
    accumulator[item.id].suppliers.push({
      id: item.supplier_id,
      code: item.code,
      title: item.title
    });
    delete accumulator[item.id].supplier_id;
    delete accumulator[item.id].code;
    delete accumulator[item.id].title;
  }
  return accumulator;
}, {});

То, что у меня есть, также выглядит довольно громоздким.Как получить результат, который я ищу, в функции очистки?

Ответы [ 5 ]

2 голосов
/ 14 мая 2019

Привет @runnerpaul в вашем коде все идеально, просто удалите строку group.suppliers = []; это будет работать в соответствии с вашими ожиданиями

1 голос
/ 14 мая 2019

Я думаю, что это лучший подход:

const normalicedCustomers = jsonCusto.customers
    .filter(
        (v, i, a) => a.indexOf(v) === i
    )
    .map(
        c => ({
            id: c.id,
            name: c.name,
            email: c.email,
            suppliers: jsonCusto.customers
                .filter(c2 => c2.id === c.id)
                .map(
                    c2 => ({
                        supplier_id: c2.supplier_id,
                        title: c2.title,
                        code: c2.code
                    })
                )
        })
    )

Я не пробовал, но должно работать. И это гораздо более читабельно

1 голос
/ 14 мая 2019

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

let customers = await query.offset(offset).limit(limit);

customers = customers.reduce((accumulator, item) => {
  if (accumulator[item.id]) {
    const group = accumulator[item.id];
    //group.suppliers = [];
    group.suppliers.push({
      id: item.supplier_id,
      code: item.code,
      title: item.title
    });
  } else {
    accumulator[item.id] = item;
    accumulator[item.id].suppliers = [];
    accumulator[item.id].suppliers.push({
      id: item.supplier_id,
      code: item.code,
      title: item.title
    });
    delete accumulator[item.id].supplier_id;
    delete accumulator[item.id].code;
    delete accumulator[item.id].title;
  }
  return accumulator;
}, {});
0 голосов
/ 14 мая 2019

Я предпочитаю цикл вместо reduce. Чтобы избежать дублирования, используется массив, подобный хеш-таблице, и все пустые слоты удаляются впоследствии.

let new_customers = [];
for (let c of customers)
{
    new_customers[c.id] = {
        id: c.id,
        name: c.name,
        email: c.email,
        suppliers: customers.filter (x => x.id == c.id).map (y => ({
            supplier_id: y.supplier_id,
            title: y.title,
            code: y.code
        }))
    }
}

new_customers = new_customers.filter (x => x != null);
0 голосов
/ 14 мая 2019

Карта поможет вам конвертировать ваши данные в указанный формат. Предположим, что входной переменной являются данные.

data.customers.map(function(v){
    v.suppliers=[
        {
            "supplier_id":v.supplier_id,
            "title": v.title,
            "code": v.code 
        }
    ]
    delete v.supplier_id;
    delete v.title;
    delete v.code;
    return v;
});
...