Как сгенерировать строку запроса из вложенного объекта - PullRequest
0 голосов
/ 27 февраля 2019

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

{
   searchValue: {
     firstName: "John",
     lastName: "Doe",
     postalCode: "3130",
     city: "New York"
   },
    page: 1
 }

Я использую библиотеку querystring , чтобы попытаться отформатировать желаемую строку.

export function updateAdvancedSearchQueryString<T>(props: RouteComponentProps, newValues: T) {
  props.history.push({
    pathname: props.location.pathname,
    search: queryString.stringify(newValues)
  });
}

Вывод, который я хочудостижения:

/trainers?page=1&searchValue=firstName=John&lastName=Doe&postalCode=3130&city=New_York

Вывод, который я сейчас получаю с этим:

/trainers?page=1&searchValue=%5Bobject%20Object%5D

Как я могу сгенерировать желаемую строку запроса из вложенного объекта?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете иметь много уровней вложенности, поэтому вы должны делать это рекурсивно.

Что-то вроде этого должно быть хорошо

const data = {
  searchValue: {
    firstName: "John",
    lastName: "Doe",
    postalCode: "3130",
    city: "New York"
  },
  page: 1
}

const createQueryString = (data) => {
  return Object.keys(data).map(key => {
    let val = data[key]
    if (typeof val === 'object') val = createQueryString(val)
    return `${key}=${encodeURIComponent(`${val}`.replace(/\s/g, '_'))}`
  }).join('&')
}

console.log(createQueryString(data))

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

...