преобразовать несколько объектов в массив объектов - PullRequest
1 голос
/ 05 марта 2020

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

const {db} = require('./constant')
const momentTz = require("moment-timezone");
const { getAuth } = require("./constant");
const officeStatus = async officeActivity => {
  let output = {};
  const maileventQuerySnapshot = await db
    .collection("MailEvents")
    .where("office", "==", officeActivity.office)
    .where("event", "==", "delivered")
    .limit(1).get();
  output["office"] = officeActivity.office;
  output["First Contact"] = officeActivity.attachment["First Contact"].value;
  output["Second Contact"] = officeActivity.attachment["Second Contact"].value;
  output["Office Creation Date"] = momentTz
    .tz(officeActivity.timestamp, officeActivity.attachment.Timezone.value)
    .format("DD MMM YYYY");
  output["Reports Sent"] = maileventQuerySnapshot.docs.length ? true:false
  const officeSubcollectionSnapshot = await db
    .collection(`Offices/${officeActivity.officeId}/Addendum`)
    .where("date","==",parseInt( momentTz(new Date()).subtract(1, "days").format("DD")))
    .where('month', '==', parseInt( momentTz(new Date()).subtract(1, 'days').format("MM"))-1)
    .where('year', '==',parseInt( momentTz(new Date()).subtract(1, "days").format("YYYY")))
     .orderBy("user").orderBy('timestamp')
    .get();
    output['Number of unique Checkin Yesterday'] =
    officeSubcollectionSnapshot.docs.length;

  const activitiesRefSnapshot = await db
    .collection("Activities")
    .where("office", "==", officeActivity.office)
    .where("template", "==", "subscription")
    .where("attachment.Template.value", "==", "check-in")
    .get();
  const phoneNumberArray = [];
  activitiesRefSnapshot.forEach(doc => {
    phoneNumberArray.push(doc.data().attachment["Phone Number"].value);
  });
  const userRecord = await Promise.all(phoneNumberArray.map(getAuth));
  output["Number of checkin Subscription Auth"] = userRecord.filter(
    doc => doc !== undefined
  ).length;
  output["Number of Checkin Subscription No Auth"] = userRecord.filter(
    doc => doc === undefined
  ).length;
  return { output};
};
module.exports = { officeStatus };

и другой файл где я запросил офис и передал объекты в качестве аргумента

 const {admin,db} = require('./constant');
const { officeStatus } = require("./officeStatus");
let execute = async () => {
  try {
    let office = await db.collection("Offices").where("status", "==", "PENDING").get();
    office.forEach(doc => {
      officeStatus(doc.data())
        .then(e => {
            console.log(JSON.stringify(e.output));
        })
        .catch(error => {
          console.log(error);
        });
    });
    return;
  } catch (error) {
    console.log(error);
  }
  return;
};
execute();
 admin.apps[0].delete();


I have get output in this way 
{}
{}
{}....
and I wanted the output in this way 
[{},{},{}]

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Обещание внутри forEach неверно. Это не даст вам ожидаемых результатов. Вы не должны использовать это, поскольку это не поддерживается. Вы должны рассмотреть возможность использования for..of или Promise.all. В вашем случае я бы предложил использовать Promise.all, так как вам нужен результат в массиве.

Promise.all(office.docs.map(doc => {
  return officeStatus(doc.data())
    .then(e => {

      return e.output;
    })
    .catch(error => {
      console.log(error);
    });
}))
.then(res => console.log(res));

0 голосов
/ 05 марта 2020
 const {admin,db} = require('./constant');
const { officeStatus } = require("./officeStatus");
let execute = async () => {
let office = await db.collection("Offices").where("status", "==", "PENDING").get()
  const arrayofObject = await  Promise.all(office.docs.map(doc => {
      return officeStatus(doc.data())
        .then(e => {
          // console.log(JSON.stringify(e.output));
          return e.output;
        })
        .catch(error => {
          console.log(error);
        });
    }))
console.log(arrayofObject)
  return;
};
execute();
 admin.apps[0].delete();
0 голосов
/ 05 марта 2020

Попробуйте сделать это:

// and the other file where i have queried the office and passed objects as an argument

 const {admin,db} = require('./constant');
const { officeStatus } = require("./officeStatus");
let execute = async () => {
  try {
    let office = await db.collection("Offices").where("status", "==", "PENDING").get();
let arr = new Array();
    office.forEach(doc => {
      officeStatus(doc.data())
        .then(e => {
            arr.push(e)
        })
        .catch(error => {
          console.log(error);
        });
    });
console.log(arr)
    return;
  } catch (error) {
    console.log(error);
  }
  return;
};
execute();
 admin.apps[0].delete();

Я только что создал массив, в который мы добавили sh e, когда делали officeStatus. Затем в конце кода мы записываем arr; объявленный массив.

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