Измените эту функцию белого списка, чтобы она возвращала объект с указанными c полями значения ключа - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь написать функцию утилиты белого списка, которую можно использовать для нескольких различных запросов на пост и патч. Прямо сейчас я пытаюсь заставить это работать только для одного сценария. Пользователь делает запрос на публикацию, запрос возвращается с объектом, который имеет несколько полей, мы только хотим, чтобы пользователь мог создавать или редактировать определенные поля в запросе. Для этого примера два поля - это key1 и invoiceDate.

У меня есть массив, который я определяю заранее, здесь он называется acceptLine1. Этот служебный метод должен иметь возможность сравнивать тело запроса с массивом acceptFields и определять, что это vLineValue, создавать копию тела запроса, новое тело будет иметь только ключи key1 и invoiceDate и должно заполнять новые объекты. ключи со значениями из запроса, отправленного пользователем.

У меня проблемы с проверкой и возвращением нового объекта со значениями. Прямо сейчас, объект результата делает копию всех ключей из объекта запроса и всех значений из объекта запроса, он должен только сделать копию полей key1 и invoiceDate и заполнить его значениями из запроса.

Извините за длинное объяснение, надеюсь, оно ясное, если понадобятся какие-либо разъяснения, я буду рад объяснить дальше.

const acceptableLine1 = ['invoiceDate', 'key1']
// body that comes from a bill line post request
let vLineValue = {
  id: 19,
  invoiceDate: '2000-01-25',
  key1: 'abc',
}
export default async (
  body,
  acceptableFieldsOne,
  acceptableFieldsTwo,
  acceptableFieldsThree,
  // acceptable fields are arrays of acceptable fields for post or patch requests to bills, bill-lines, dist-lines
) => {
  // start off with taking the body input and making a copy of it
  const whiteListBody = body;

  // after making a copy of the body, check each of the arrays, see if the body has keys that match any of the array strings
  // get an array of the keys from the body
  const whiteListObjectKeys = Object.keys(whiteListBody);

  // get an array of the whiteList objects values
  const whiteListObjectValues = Object.values(whiteListBody);

  // compare whiteListObjectKeys array with each of the acceptableFields arrays
  // if the arrays match, return a new object with the keys that match and their original values

// result should only have the keys 'key1' and 'invoiceDate' with the values 'abc', '2000-01-25'
  result = Object.fromEntries(
    whiteListObjectKeys.map((_, i) => [
      whiteListObjectKeys[i],
      whiteListObjectValues[i],
    ])
  );
};

1 Ответ

1 голос
/ 13 февраля 2020

Попробуйте вернуть нужные записи, используя метод массива filter(). Превратите объект body в массив с парами [key, value], используя Object.entries(), отфильтруйте этот массив и превратите записи обратно в объект.

Кроме того, вы не действительно нужно создать копию body, но если вы используете Object.assign() для создания фактической копии.

Я создал ...acceptableFields параметр rest принимать неограниченное количество acceptableFields массивов. Эти массивы будут объединены в один массив с flat(), через который фильтр будет проходить через l oop.

const acceptableFieldsVoucherLine = ['invoiceDate', 'description']
// body that comes from a voucher line post request
let VoucherLine = {
  id: 12,
  invoiceDate: '2020-02-27',
  description: 'abc',
  voucherId: '18',
  createdBy: 'some value',
  orgServiceDate: null,
  paymentDate: null,
  processingDate: null,
  updatedBy: null,
  createdAt: 'some value',
  updatedAt: 'some value',
  amountCents: 0,
  federalAmountCents: 0,
  nonFederalAmountCents: 0,
  archivedAt: null,
  lineNumber: 7
}
export default async (body, ...acceptableFields) => {

  // Start off with taking the body input and making a copy of it.  
  const whiteListBody = Object.assign({}, body);

  // Convert object to array with entries: [key, value] pairs.
  const whiteListEntries = Object.entries(whiteListBody);

  // Combine all arrays into a single array.
  const acceptableFieldsList = acceptableFields.flat();

  // Function for checking if the key matches an acceptable field.
  const whiteListHasEntry = ([key, value]) => acceptableFieldsList.some(field => field === key);

  // Filter the entries with the whiteListHasEntry function.
  const filteredWhiteListBody = whiteListEntries.filter(whiteListHasEntry);

  // Turn the result back into an object.
  const result = Object.fromEntries(filteredWhiteListBody);

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