09.12.2018, 17:35
|
Новичок на форуме
|
|
Регистрация: 18.01.2018
Сообщений: 4
|
|
Сравнить адресную строку на наличие повторений
доброго времени суток. Может кто сможет подсказать с одной задачкой.
Есть две строки.
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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от Maldades
|
par2=RR
|
Сообщение от Maldades
|
par2=A
|
?
|
|
09.12.2018, 18:13
|
Новичок на форуме
|
|
Регистрация: 18.01.2018
Сообщений: 4
|
|
да, в условии нужно проверить на повторение одинаковых параметров и удалить лишнее. т.е. он должен удалить второй par2 из первой str, не добавить par1 в str1 так как уже par1 там есть, но добавить par5)
Надеюсь понятно объяснил))
|
|
09.12.2018, 18:43
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
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>
|
|
09.12.2018, 19:09
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
|
|
10.12.2018, 00:31
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Сообщение от Maldades
|
первая типа адресная строка и там разные параметры
|
location.search начало строки с знака вопроса должно быть
function createObj(str) {
var vars = {};
str.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (_, key, value) { vars[key] = value});
return vars;
}
|
|
10.12.2018, 05:42
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
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));
|
|
10.12.2018, 11:21
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
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));
|
|
10.12.2018, 12:26
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Вариант
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));
Последний раз редактировалось Vlasenko Fedor, 10.12.2018 в 12:28.
|
|
|
|