Декодировать (цикл), пока строка URI не будет одинаковой - PullRequest
0 голосов
/ 05 октября 2018

Я бы хотел декодировать строку URI, пока не произойдет никаких изменений.Обычно строка URI содержит около 53'000 символов.Так что сравнение должно быть быстрым.В моем примере кода я использовал короткую форму строки.

Вот мой пример кода, который, к сожалению, не работает:

var uri = "https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab_VERY_LONG_URL"
var firstDecode = decodeURIComponent(uri.replace(/\+/g,  " "));
var res = Decode(firstDecode);

function Decode(firstDecode){
    var secondDecode = decodeURIComponent(uri.replace(/\+/g,  " "))
    while (firstDecode.localeCompare(secondDecode) != 0) {
        firstDecode = decodeURIComponent(uri.replace(/\+/g,  " "))
    }

  return firstDecode;
}


/* Expected Returns:
localeCompare()
 0:  exact match
-1:  string_a < string_b
 1:  string_a > string_b
 */

Как я могу сделать это самым плавным способом?Заранее спасибо.

Обновление 1

Хорошо, новая версия моего кода:

var uri = "https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab_VERY_LONG_URL"
var res = Decode(uri);

function Decode(uri){
    var initialURI = URI
    var newURI = decodeURIComponent(uri.replace(/\+/g,  " "));

    If (initialURI === newURI) {
        // no changes anymore
        return newURI;
    } else {
        // changes were detected, do this function again
        var res = Decode(newURI);
    }
}

Но он все еще не работает правильно.

1 Ответ

0 голосов
/ 06 октября 2018

Вы пытаетесь рекурсивно декодировать некоторые encoded URI, пока не расшифрует , это больше не изменит result?

Если мое пониманиеправильно, см. ниже:

/* Suppose our sample case is a recursively encoded URI */

let URIEncoded = "https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab_VERY_LONG_URL"
console.log('URI ENCODED ONCE:', URIEncoded)

let URIEncodedTwice = encodeURIComponent(URIEncoded)
console.log('URI ENCODED TWICE:', URIEncodedTwice)

let URIEncodedThrice = encodeURIComponent(URIEncodedTwice)
console.log('URI ENCODED THRICE:', URIEncodedThrice)


/* Get the original URI */
let baseURI = decodeNestedURI(URIEncodedThrice);
console.log('BASE URI:', baseURI) // print result

/* function decodeNestedURI returns the base URI of one that's been encoded multiple times */
function decodeNestedURI(nestedURI) {
    let oldURI = nestedURI
    let newURI = null
    let tries = 0

    while (true) {
      tries++
      newURI = decodeURIComponent(oldURI);
      
      if (newURI == oldURI) break // quit when decoding didn't change anything
      
      oldURI = newURI
    } 
    console.log('TIMES DECODED:', tries-1) // -1 because the last decoding didn't change anything
    return newURI 
}

Надеюсь, это поможет.Cheers,

...