2
const a = '/sport/football/1';
const b = '/football/1?a=1'

How can I combine these 2 url's to get this one :

const c = '/sport/football/1?a=1';

Note: Basically the first url can have a different starting point and the second one can have multiple query params. But they have in common the middle part.

2
  • can you paste what you have tired so far Commented Sep 3, 2021 at 9:17
  • for the first one get the string between the first and second slash, for the second one the string between the second and third slash and combine them. Commented Sep 3, 2021 at 9:19

3 Answers 3

2

From the way your question looks to me you want to be able to merge two urls in a way the the second one will be appended to the first one if it is not yet in the url or be integrated into the first one if there is a overlap.

For that you need to do some testing and modifying of the strings to get to the result that you want.

Here is one possibility of solving that issue.

Known issue with this solution: it will not handle repitition in a URL.

URL a = asd/dsa/asd/dsa/123?321=123

URL b = /dsa/asd/dsa/123?321=456

result = asd/dsa/asd/dsa/asd/dsa/123?321=456

If you need to cover that case then you have to enhance the index section to find the correct occurence.

// Edit: There was an issue that allowed substrings of b to be found in a, that has been solved by also converting URL a to an array for the check

the error would be as follows:

URL a = asd/dsa/123

URL b = as/321

Result = as/321

because URL b [0] (as) is a substring of asd in URL a and would therefore be found by String.lastIndexOf

function calculateUrl(urla, urlb) {
  // we start by initialising the new url with URL a
  let ret = urla;
  
  // we split the URL a on / and cleaning it up to make sure we dont have an empty first value
  // we need this as a string check might cause a problem when part of aUrlb[0] is found in urla
  const aUrla = urla.split("/").filter(function(elm) {
    return typeof elm === "string" && elm.length > 0;
  });
  
  // we split the URL b on / and cleaning it up to make sure we dont have an empty first value
  const aUrlb = urlb.split("/").filter(function(elm) {
    return typeof elm === "string" && elm.length > 0;
  });
  
  // we generate a new string for URL b without a leeding /
  const appendix = aUrlb.join("/");
  
  // we choose the first element of URL b to check if URL b is part of URL a or if it has to be appended
  const searchTerm = aUrlb[0];
  
  // we perform the check
  const foundAt = aUrla.lastIndexOf(aUrlb[0]);
  
  if(foundAt !== -1) {
    // if we found that URL a and b have a overlap we only use the part of URL a that is unique
    ret = aUrla.slice(0, foundAt).join("/") + "/";
  } else {
    // if we found that URL a and b do not have a overlap we need to make sure that URL a does not contain a ?
    ret = ret.split("?")[0]
    // we also need to make sure URL ends in / as we will append URL b to it
    if(ret.substring(ret.length - 1) !== "/") {
      ret = ret + "/";
    }
  }
  
  // combine URL a and b
  return ret + appendix;
}


// ignore this, it's just so the button will work
document.getElementById("calculate").addEventListener("click", function() {
  let p = document.createElement("p");
  p.textContent = calculateUrl(document.getElementById("urla").value, document.getElementById("urlb").value);
  document.getElementById("output").appendChild(p);
});
<label>
URL A:
<input id="urla">
</label>
<br>
<label>
URL B:
<input id="urlb">
</label>
<br>
<button id="calculate">
Calculate
</button>
<div id="output"></div>

Sign up to request clarification or add additional context in comments.

Comments

1

const a = "/sport/football/1";
const b = "/football/1?a=1";

const c = a + b.substring(b.indexOf("?"));
console.log(c);

2 Comments

Can I count on that there will be only 1 x ? in the URL and not multiple ones ? What I tried so far was to split b by ? and add the second parameter to a.
Yes, there can be only one question mark: developer.mozilla.org/en-US/docs/Learn/Common_questions/…
0

i tried to find the last index of all ducplicate character then merging both of them. let me know if something doesnt work correctly.

const ur1 = '/sport/football/1';
const ur2 = '/football/1?a=1';

// get the last duplicate index
let dupCount = 0, dupMark = 0;
for(let a=0; a<ur1.length; a++){
    for(let b=0; b<ur2.length; b++){
      if( ur1[a+b] === ur2[b] ){
        //console.log( ur1[a+b] +' : '+ ur2[b] );
        dupCount += 1;
        if( ur2[b] !== '/' && dupCount > 0 ){ 
          dupMark = b;
        }
      }else{
        dupCount = 0;
        break;
      }
    }
}

console.log( 'last duplicate url index : '+ dupMark );
console.log( ur1+ur2.substr(dupMark) );

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.