koryakinp
koryakinp

Reputation: 4125

Join string based on startsWith() and endsWith()

I have string var str1 = 'foobarbaz' and var str2 = 'bazfoo'

I want to join them based on overlapping starting and ending characters. The result I am looking for is 'foobarbazfoo'.

I am currently doing it in a following way:

function merge(str1, str2) {
    var size = Math.min(str1.length, str2.length);
    index = 0;
    for (var i = 0; i < size; i++) {

        var ends = str1.substr(str1.length - i);
        var starts = str2.substr(0, i);

        if (ends === starts) {
            index = i;
        }
    }

    if (index === 0) {
        throw 'Strings do not overlap';
    } else {
        return str1 + str2.substr(index, str2.length);
    }
}

I wonder, if there is more elegant and efficient way of doing it ?

Upvotes: 2

Views: 537

Answers (1)

Taki
Taki

Reputation: 17654

i think it would be a good idea to add the function to the String's prototype and using startsWith() and Conditional (ternary) Operator this what i could come up with :

String.prototype.merge = function(str) {
  let match;
  for (let i = this.length; i >= 0; i--)
    (str.startsWith(this.slice(i))) && (match = this.slice(i));

  return this.slice(0, this.indexOf(match)) + str.slice(str.indexOf(match), str.length)
}

let merged = 'foobarbaz'.merge('bazfoo')

console.log(merged);

in terms of speed, both methods are identical ( tested execution time with Performance.now() )

but less lines and a declarative rather than imperative code.

feel free to choose betwee slice and substring ( slice vs substring )

Upvotes: 1

Related Questions