Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сравнить адресную строку на наличие повторений (https://javascript.ru/forum/dom-window/76153-sravnit-adresnuyu-stroku-na-nalichie-povtorenijj.html)

Maldades 09.12.2018 17:35

Сравнить адресную строку на наличие повторений
 
доброго времени суток. Может кто сможет подсказать с одной задачкой.
Есть две строки.
str1 = '&par1=1&par2=RR&par3=234,223&par2=A';
str2 = '&par1=2&par5=pp';
первая типа адресная строка и там разные параметры. могут быть разные имена у параметров и так же разные значения. нужно сделать так что бы проверялась строка и не повторяла параметры и добавляла из второй строки те параметры которых нет в первой. Т.е. должна получиться строка
str1 = '&par1=1&par2=RR&par3=234,223&par5=pp';

рони 09.12.2018 18:06

Цитата:

Сообщение от Maldades
par2=RR

Цитата:

Сообщение от Maldades
par2=A

?:-?

Maldades 09.12.2018 18:13

да, в условии нужно проверить на повторение одинаковых параметров и удалить лишнее. т.е. он должен удалить второй par2 из первой str, не добавить par1 в str1 так как уже par1 там есть, но добавить par5)
Надеюсь понятно объяснил))

рони 09.12.2018 18:43

Maldades,
<script>
str1 = '&par1=1&par2=RR&par3=234,223&par2=A';
str2 = '&par1=2&par5=pp';

function fn(str1, str2) {
    function createObj(str) {
        return (str.match(/([^&]+=[^&]+)/g) || []).reduce(function(a, b) {
            b = b.split("=");
            a[b[0]] || (a[b[0]] = b[1]);
            return a
        }, {})
    }
    str1 = createObj(str1);
    str2 = createObj(str2);
    str2 = Object.assign(str2, str1);
    str2 = Object.entries(str2).map(function(e) {
        return "&" + e.join("=")
    }).join("");
    return str2
};
str2 = fn(str1, str2)
document.write(str2)
  </script>

laimas 09.12.2018 19:09

Object.assign - для ишака тут как всегда проблемы https://msdn.microsoft.com/ru-ru/lib...(v=vs.94).aspx :)

Vlasenko Fedor 10.12.2018 00:31

Цитата:

Сообщение от Maldades
первая типа адресная строка и там разные параметры

location.search начало строки с знака вопроса должно быть
function createObj(str) {
    var vars = {};
    str.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (_, key, value) { vars[key] = value});
    return vars;
}

j0hnik 10.12.2018 05:42

str1 = '&par1=1&par2=RR&par3=234,223&par2=A';
str2 = '&par1=2&par5=pp&par2=2';
str3 = '&par6=2&par5=pp&par7=2';

var filterURL=(...arg)=>
arg.join('')
.match(/&[^=]+=[^&]+/g)
.filter((e, i, s)=>s.findIndex(el=>el.match(/&[^=]+/)[0] == e.match(/&[^=]+/)[0]) == i)
.join('');

console.log(filterURL(str1,str2,str3));

Alexandroppolus 10.12.2018 11:21

function merge(str1, str2) {
	var map = Object.create(null);
	return (str1 + str2).replace(/&([^=]+)=[^&]*/ig, function (m, n) { return map[n] ? '' : (map[n] = true, m); });
}

var str1 = '&par1=1&par2=RR&par3=234,223&par2=A';
var str2 = '&par1=2&par5=pp';

alert(merge(str1, str2));

Vlasenko Fedor 10.12.2018 12:26

Вариант :dance:
let str1 = '&par1=1&par2=RR&par3=234,223&par2=A';
let str2 = '&par1=2&par5=pp';

const merge = (str, table = {}) => str.replace(/[?&]+([^=&]+)=([^&]*)/gi,
  (t, key) => !table[key] && (table[key] = 1) ? t : '');

alert(merge(str1 + str2));


Часовой пояс GMT +3, время: 14:44.