Лучший способ конвертировать параметры URL-запроса в форматированный массив - PullRequest
1 голос
/ 02 апреля 2020

У меня есть URL с параметрами запроса, который выглядит примерно так &rootDimension=availability%253AOnlinepipsymbBrand%253ADell%253ABICpipsymbProduct%2520Rating%254A3%2520stars%2520and%2520above

Я делаю decodeURIComponent(query.rootRootdimension).split("pipsymb"), который возвращает массив, который выглядит следующим образом ["availability:Online", "Brand:Dell:BIC", "Product Rating:4 stars and above"]

Я в принципе нужно проверить массив и удалить ключи, которые не являются "Бренд" или "Рейтинг продукта". Так что в этом случае он должен возвращать массив ["Brand:Dell:BIC", "Product Rating:4 stars and above"].

Если рейтинг продукта "4 звезды и выше", замените его на "Лучший рейтинг", если нет, то просто сохраните рейтинг, например ["Brand:Dell:Bic", "Product Rating: "3 stars and above"]. Массив должен выглядеть следующим образом ["Brand:Dell:BIC", "Product Rating:Top Rated"].

Результат, который я ищу: ["Dell", "Bic", "Top Rated"]

Я попробовал функцию ниже и несколько других вещей, но я не получил то, что искал. Спасибо за помощь / предложения!

const getRefinements = (query) => {
  decodeURIComponent(query.rootDimension).split("pipsymb").reduce((obj, str) => {
            let strParts = str.split(/::|:/);
            if (strParts[0] && strParts[1]) {
                obj[strParts[0].replace(/\s+/g, "")] = strParts[1];
                return Object.values(pick(obj, ["Brand", "ProductRating"]))
            }
   })
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Если у вас есть контроль над URL-адресом, вы должны разбить то, что вы хотите получить, на &availability=Online&brand=Dell,BIC&productRating=4 stars and above

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

let queryString = `&availability=Online&brand=Dell,BIC&productRating=4 stars and above`,
    urlParams   = new URLSearchParams(queryString),
    results     = {},
    arr         = [];

urlParams.forEach((v,k) => {
  if (k === "productRating") {
    if (v === "4 stars and above") {
      results.rating = "Top Rated";
    } else {
      results.rating = v;
    }
  } else if (k === "brand") {
    results.brands = v.split(","); // replace with ":" if delimiter cannot be changed
  }
});

// this should be what you get
// results = { 
//   rating : "Top Rated",
//   brands : ["Dell", "BIC"]
// }

// this will give you what you originally wanted, but it's not a very good data structure, use results instead if possible
arr = results.brands.concat(results.rating);
0 голосов
/ 02 апреля 2020

Попробуйте следующее:

let query = decodeURIComponent(
  "&rootDimension=availability%253AOnlinepipsymbBrand%253ADell%253ABICpipsymbProduct%2520Rating%254A3%2520stars%2520and%2520above"
);

query = query
  .replace(/%3A/g, ":")
  .replace(/%20/g, " ")
  .replace(/%4A/g, "J");

const productDetails = query.split("pipsymb");

let brandPart = productDetails
  .find(item => item.match("Brand"))
  .replace("Brand:", "")
  .split(":");

let productRating = productDetails
  .find(item => item.match("Product Rating"))
  .split("J")[1];

if (productRating.includes("4")) {
  productRating = "Top Rated";
}

const result = [...brandPart, productRating];
console.log(result);

Вывод

['Dell', 'BIC', '3 stars and above']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...