Dustin Diaz put an interesting task on his blog. In short, you have an array:
var arr = ["a", "b", "c", "c", "d", "e", "e", "e", "e", "e",
"f", "e", "f", "e", "f", "a", "a", "a", "f", "f", "f"];
and it should be turned into string like this:
"a b c c d e e <span>e e e</span> f e f e f a a <span>a</span> f f
<span>f</span>"
First solution in my mind is this:
alert(arr.join(" ").replace(/([a-z])\s\1\s((\1\s?)+)(?=\s|$)/g,
"$1 $1 <span>$2</span>"));
But I feel like a cheater, probably I missed some limitation in the task. Will submit it and wait for comments from Dustin. In case I got it wrong, I will update the post.
Update
Just in case I have to use forEach
function:
var arr = ["a", "b", "c", "c", "d", "e", "e", "e", "e",
"e", "f", "e", "f", "e", "f", "a", "a", "a", "f", "f", "f"];
Array.prototype.forEach = function (f) {
for (var i = 0, ii = this.length; i < ii; i++) {
f(this[i], i, this);
}
};
var res = "", isTag = false;
arr.forEach(function (item, index, ar) {
if (!isTag && ar[index - 1] == ar[index - 2] && ar[index - 2] == item) {
res += "<span>";
isTag = true;
}
res += item;
if (isTag && ar[index + 1] && ar[index + 1] != item) {
res += "</span>";
isTag = false;
}
if (ar[index + 1]) {
res += " ";
} else if (isTag) {
res += "</span>";
}
});
console.log(res);