Обновите json, чтобы отображать количество объектов в массиве json, а не в списке в приложении Node - PullRequest
0 голосов
/ 11 мая 2019

У меня есть такая структура json:

    {
        "sales_rep": {
            "1": {
                "id": 1,
                "name": "Joe",
                "email": "joebloggs@email.com",
                "customers": [
                    {
                        "id": 1,
                        "address": "1 High Street",
                        "name": "CUSTOMER1",
                        "supplierId": 1,
                    },
                    {
                        "id": 2,
                        "address": "2 High Street",
                        "name": "CUSTOMER2",
                        "supplierId": 1,
                    },
                    {
                        "id": 3,
                        "address": "3 High Street",
                        "name": "CUSTOMER3",
                        "supplierId": 1
                    },
                ]
            }
        }
    }

Можно ли написать функцию, которая будет подсчитывать количество клиентов вместо сведений о клиенте?Я собираюсь закончить с чем-то вроде этого:

    {
        "sales_rep": {
            "1": {
                "id": 1,
                "name": "Joe",
                "email": "joebloggs@email.com",
                "customers": "3"
            }
        }
    }

Я думаю, что мне нужна какая-то функция уменьшения, но я не уверен, как это сделать.

Один изОсновные проблемы, которые у меня возникают, состоят в том, что оригинальный json был сгенерирован с помощью этой Sequelize модели:

let users = db.SalesRep.findAll({
  attributes: ['id', 'name', 'email'],
  include: [{
    model: db.Customers,
    as: 'customers',
  }],
  where: {'id': "1"},
  order: orderClause,
  offset,
  limit,
});

Если я добавлю console.log(users), я получу это:

Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _trace:
   { Error
       at Promise.longStackTracesCaptureStackTrace [as _captureStackTrace] (/Users/paulcarron/git/Eighty8/updated-api/node_modules/bluebird/js/release/debuggability.js:411:19)
       at Promise._then (/Users/paulcarron/git/Eighty8/updated-api/node_modules/bluebird/js/release/promise.js:232:17)
       at Promise.then (/Users/paulcarron/git/Eighty8/updated-api/node_modules/bluebird/js/release/promise.js:125:17)
       at Function.findAll (/Users/paulcarron/git/Eighty8/updated-api/node_modules/sequelize/lib/model.js:1748:8)
       at Function.User.listForAdmin (/Users/paulcarron/git/Eighty8/updated-api/app/models/User.js:65:25)
       at router.get (/Users/paulcarron/git/Eighty8/updated-api/app/controllers/admin.js:277:35)
       at Layer.handle [as handle_request] (/Users/paulcarron/git/Eighty8/updated-api/node_modules/express/lib/router/layer.js:95:5)
       at next (/Users/paulcarron/git/Eighty8/updated-api/node_modules/express/lib/router/route.js:137:13)
       at /Users/paulcarron/git/Eighty8/updated-api/app/middlewares/role.js:6:12
       at Layer.handle [as handle_request] (/Users/paulcarron/git/Eighty8/updated-api/node_modules/express/lib/router/layer.js:95:5)
       at next (/Users/paulcarron/git/Eighty8/updated-api/node_modules/express/lib/router/route.js:137:13)
       at cognitoExpress.validate (/Users/paulcarron/git/Eighty8/updated-api/app/middlewares/access.js:25:7) _parent: undefined, _promisesCreated: 0, _length: 1 } }

Ответы [ 2 ]

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

findAll() - асинхронная функция, она возвращает Обещание.Вам нужно использовать .then(), чтобы получить результат и выполнить там преобразование.

db.SalesRep.findAll({
  attributes: ['id', 'name', 'email'],
  include: [{
    model: db.Customers,
    as: 'customers',
  }],
  where: {'id': "1"},
  order: orderClause,
  offset,
  limit,
}).then(function(users) {
    let sales_rep = users.sales_rep;
    for (let key in sales_rep) {
        sales_rep[key].customers = sales_rep[key].customers.length;
    }
    // do more stuff with users
});
0 голосов
/ 11 мая 2019
   let data = {
        "sales_rep": {
            "1": {
                "id": 1,
                "name": "Joe",
                "email": "joebloggs@email.com",
                "customers": [
                    {
                        "id": 1,
                        "address": "1 High Street",
                        "name": "CUSTOMER1",
                        "supplierId": 1,
                    },
                    {
                        "id": 2,
                        "address": "2 High Street",
                        "name": "CUSTOMER2",
                        "supplierId": 1,
                    },
                    {
                        "id": 3,
                        "address": "3 High Street",
                        "name": "CUSTOMER3",
                        "supplierId": 1
                    },
                ]
            }
        }
    }

let customerCount = data.sales_rep['1'].customers.length
Object.assign(data.sales_rep['1'], { customers: customerCount})
console.log(data)

db.SalesRep.findAll метод возвращает обещание, поэтому вы можете использовать await для получения результата

   let users = await db.SalesRep.findAll({
      attributes: ['id', 'name', 'email'],
      include: [{
        model: db.Customers,
        as: 'customers',
      }],
      where: {'id': "1"},
      order: orderClause,
      offset,
      limit,
    })
        let sales_rep = users.sales_rep;
        for (let key in sales_rep) {
            sales_rep[key].customers = sales_rep[key].customers.length;
        }
...