JavaScript is great for prototyping ideas. Okay, so it's a prototype-based language but we probably mean slightly different things.
I wanted to do a calculated selection of a value and quickly threw together the following, which takes a parameter, compares it to an array of possible match/result pairs, along with a default value in the event that there's no match in the match/result pairs. I also coded in the possibility of embedding a function.
Here's the ES3 code
function selector(target, casevalues, defaultvalue) {
for (var i = 0; i < casevalues.length; i++) {
var caseval = casevalues[i];
if ("string" === typeof caseval[0]) {
if (target === caseval[0]) {
return caseval[1];
}
} else { //assume function
return caseval[0](target);
}
}
return defaultvalue;
}
and the equivalent ES5 code
const selector = (target, casevalues, defaultvalue) => {
for (let i = 0; i < casevalues.length; i++) {
const caseval = casevalues[i];
if ("string" === typeof caseval[0]) {
if (target === caseval[0]) {
return caseval[1];
}
} else { //assume function
return caseval[0](target);
}
}
return defaultvalue;
}
Evaluating that can be done like this (ES3 then ES5):
var target = selector("page value", [
["domain", "domain"],
["subdomain", "subdomain"],
[function (x) {
return x === "page value" ? "page" : x
}
]], "");
let target = selector("page value", [
["domain", "domain"],
["subdomain", "subdomain"],
[x => x === "page value" ? "page" : x
]], "");
So pretty cool, right? We-e-e-ell, maybe not. The whole thing might just as readily be expressed in a shorter piece of code, and done inline, using in-place evaluation. ES3 and ES5:
var target = (function (item) {
switch (item) {
case "page value":
return (function (x) {
return x === "page value" ? "page" : x
}(item));
case "domain":
return "domain";
case "subdomain":
return "subdomain";
}
return "";
}("page value"));
const target = (item => {
switch (item) {
case "page value":
return (x => x === "page value" ? "page" : x)(item);
case "domain":
return "domain";
case "subdomain":
return "subdomain";
}
return "";
})("page value");
Cost-benefit is the key here. Where I was wanting the original selector, the inline worked better and was more efficient. Maybe you do want to have a generalised selector
function, in which case something like the above would work. An improvement might be to pass in an array of key-value-pair objects instead of an array of match/result pairs.
Okay, that's me done with thinking aloud for now. Kudos to Lebab's online editor for helping with the ES3 to ES5 conversions.
Top comments (0)