Вопрос:

Как я могу преобразовать объект запроса в строковый объект в JavaScript?

javascript object request stringify

43 просмотра

3 ответа

689 Репутация автора

Использование Objectтаких методов, как entriesи keysпроизводить пустые массивы. JSON.stringifyвыдает пустой объект в браузере и ошибку циклической ссылки в Node.js.

const request = new Request(
  'https://example.com/send',
  {
    method: 'POST',
    body: 'Hello world',
    headers: {'x-planet-origin': 'Mars'},
  },
);

const keys = Object.keys(request);
const values = Object.values(request);
const entries = Object.entries(request);
const string = JSON.stringify(request);

console.log({keys, values, entries, string, request});

Автор: jsejcksn Источник Размещён: 11.08.2019 06:01

Ответы (3)


1 плюс

3521 Репутация автора

Вы можете попробовать что-то вроде этого:

const request = new Request(
  'https://example.com/send',
  {
    method: 'POST',
    body: 'Hello world',
    headers: {'x-planet-origin': 'Mars'},
  },
);

const str = JSON.stringify(request, ['bodyUsed',
'cache',
'credentials',
'destination','headers',
'integrity',
'isHistoryNavigation',
'keepalive',
'method',
'mode',
'redirect',
'referrer',
'referrerPolicy',
'signal',
'url']);
 
console.log(str);

//iterating dinamically
let props = [];
for(let prop in request){
props.push(prop);
}

const str2 = JSON.stringify(request, props);
 
console.log(str2);

Как вы могли видеть, свойства наподобие signalпустого объекта, если вам не нужны такие свойства, это возможное решение.

Если вы все еще хотите свойства, подобные, signalвы можете сделать что-то вроде этого в качестве второго шага:

const signal = JSON.stringify(request.signal, ['aborted', 'onabort']);
Автор: Emeeus Размещён: 11.08.2019 07:21

-1 плюса

587 Репутация автора

Пытаться const reqrCopy = JSON.parse(JSON.stringify(request))

Затем вы можете использовать все методы, которые вы опробовали позже, keysи entriesт. Д. (На копии). Объект запроса может быть вложенным, и поэтому вы хотите сделать это, чтобы сделать глубокую копию для этих методов.

Автор: Michael Размещён: 11.08.2019 02:13

0 плюса

689 Репутация автора

Вы можете использовать эти функции для преобразования строковых значений в объекте Request в значения в простом объекте. Одна только первая функция создаст описанный объект, а остальные помогут создать версию с отсортированными свойствами.

function requestAsObject (request) {
  if (!request instanceof Request)
    throw Object.assign(
      new Error(),
      {name: 'TypeError', message: 'Argument must be a Request object'}
    );
  request = request.clone();

  function stringifiableObject (obj) {
    const filtered = {};
    for (const key in obj)
      if (['boolean', 'number', 'string'].includes(typeof obj[key]) || obj[key] === null)
        filtered[key] = obj[key];
    return filtered;
  }

  return {
    ...stringifiableObject(request),
    headers: Object.fromEntries(request.headers),
    signal: stringifiableObject(request.signal),
    // bodyText: await request.text(), // requires function to be async
  };
}

function requestAsArrayEntries (request) {
  if (!request instanceof Request)
    throw Object.assign(
      new Error(),
      {name: 'TypeError', message: 'Argument must be a Request object'}
    );
  request = request.clone();

  function entriesFromObject (obj) {
    const entries = [];
    for (const key in obj)
      if (['boolean', 'number', 'string'].includes(typeof obj[key]) || obj[key] === null)
        entries.push([key, obj[key]]);
    return entries.sort();
  }

  return [
    ...entriesFromObject(request),
    ['headers', [...request.headers].sort()],
    ['signal', entriesFromObject(request.signal)],
    // ['bodyText', await request.text()], // requires function to be async
  ].sort();
}

function objectFromNestedEntries (arrayOfEntries) {
  if (!Array.isArray(arrayOfEntries)) return arrayOfEntries;
  const obj = {};
  for (const [key, value] of arrayOfEntries) {
    obj[key] = objectFromNestedEntries(value);
  }
  return obj;
}

const request = new Request('https://example.com/send', {
  method: 'POST',
  body: 'Hello world',
  headers: {'x-planet-origin': 'Mars'},
});

const object = requestAsObject(request);
const arrayEntries = requestAsArrayEntries(request);
const sortedObject = objectFromNestedEntries(arrayEntries);

console.log({
  object,
  arrayEntries,
  sortedObject,
  objectAsString: JSON.stringify(object),
  sortedObjectAsString: JSON.stringify(sortedObject),
});

Спасибо, Эмиус , за то, что помог мне подумать в правильном направлении .

Автор: jsejcksn Размещён: 11.08.2019 03:08
Вопросы из категории :
32x32