Подскажите как дописать скрипт, чтобы убирались дубликаты из строки URL get запроса

Вот URL

pageno=1&email=&surname=&surname=&surname=&placeofwork=&position=&name=иван&middlename=в

Вот скрипт

<script>
        function clearSeacrh(curProp, curVal) {
            let tmp = '';
            tmp = `&${curProp}=${curVal}`;
            window.location.search = window.location.search + tmp;
            
        }
    </script>

<?php
if ($firstrow) { // поиск
        echo "</tr><tr>";
        foreach ($current_row as $key => $value) {
        if  (in_array($key, $fields2hide)) {
        
            continue;
               }
            
            $nameru = (isset($fieldnames[$key])) ? $fieldnames[$key] : $key;
            
            $tmp = '`&${' . 'this.name' . '}=${' . 'this.value' . '}`';
            
            $tmpval = (isset($filter[$key])) ? $filter[$key] : '';
            
            echo "<td><form data-submit='filter' method='get' autocomplete='off' role='form'><input type='text' value='{$tmpval}' name='{$key}' placeholder='{$nameru}' class='form-control' onblur='clearSeacrh(this.name, this.value)'></form></td>";
        }   
                        
        $firstrow = FALSE;
        echo "</tr><tr>";
    }

Ответы (1 шт):

Автор решения: yar85

Простой способ когда дублирование полное (когда пара имени и значения повторяется целиком) - он подходит к случаю из вопроса, но может не подойти к другим случаям:

const queryStr = 'pageno=1&email=&surname=&surname=&surname=&placeofwork=&position=&name=иван&middlename=в';

const filteredQueryStr = [...new Set(queryStr.split('&'))].join('&');
console.log(filteredQueryStr);


Способ чуть посложнее, учитывающий дублирование только имен параметров (а значением берется только последнее) - такой способ более универсальный:

const queryStr = 'pageno=1&email=&surname=foo&surname=bar&surname=baz&placeofwork=&position=&name=иван&middlename=в';

const paramsDict = queryStr.split('&').reduce((rslt, part) => {
  const [key, val] = part.split('=');
  rslt[key] = val;
  return rslt;
}, {});
const filteredQueryStr = Object.entries(paramsDict).map(
  ([key, val]) => [key, val].join('=')
).join('&');
console.log(filteredQueryStr);


Еще можно использовать формирование query-строки через экспериментальный глобальный объект URL (у него есть объектный интерфейс взаимодействия со строкой параметров), но в этом вопросе формирование полного URL весьма неоднозначное, поэтому в ответе я ограничусь только ссылкой на справочную информацию об этом объекте.

→ Ссылка