Hello,
I want to create a function that takes two parameters: an object and a method to apply to it. See code below. Any help would be greatly appreciated!
<script>
//A function that applies a method to an object.
var applyMethodToVariable = function(object, method) {
var applyMethod = object + method;
console.log(applyMethod)
}
applyMethodToVariable("Ryan", ".length()")
//Desired result: console logs 4.
//Result I get: "Ryan.length()".
</script>
First of all, you are not passing an object or a method to your function. You are passing two strings, so you are getting the concatenation of the two strings.
Do you understand what an object is? Do you understand what a method is?
If not, I strongly suggest you work through the Free Code Camp JavaScript Algorithms and Data Structures certification before proceeding any further.
My last post may have come across a bit too harsh. You can do what you want, but you would need to define a function that would return the length of the string.
function applyFunctionToString(str, func) {
return func(str);
}
function getLengthOfString(str) {
return typeof str === 'string'
? str.length
: null;
}
console.log(applyFunctionToString('Ryan', getLengthOfString)); // 4
console.log(applyFunctionToString(3, getLengthOfString)); // null
My wording may not have been perfect, in which case, I do apologize. If instead of “Ryan” I passed myName (i.e. var myName = “Ryan”
that would be an object. I hope people viewing my post can understand what I’m trying to convey here.
To expand:
I could get the answer by using: myName.length (if I write it out). But what if I have myName and separately methodToUse (i.e. var methodToUse = “.length”), and I want to join them in a way that returns 4 (i.e. so it behaves like myName.length) instead of returning a string “myName.length”? This is the question I’m hoping to get help with. It isn’t feasible for me to write a new function for every method I may want to use. If anyone has ideas, I’m open to anything.
Thanks,
Ryan
Will this function be used on user input? If you can share a bit more of the purpose of such a function, I can offer a bit more guidance.
As long as the function would only be used on “controlled” input (no user input), then you could do something like:
function applyMethodToStr(str, method) {
return eval(`"${str}"${method}`);
}
applyMethodToStr('Ryan', 'length'); // 4
applyMethodToStr('Ryan', '.indexOf("y")'); // 1
Just keep in mind, it is highly frowned upon to use the eval
method unless it is absolutely needed. 99% of the time, there is another way to accomplish the task without using it.
NOTE: There are many edge cases of the function I wrote above that will fail in the function’s current state.
For example, if the string had any double quotes in it, the function would error out:
applyMethodToStr('"Ryan"', 'length'); // SyntaxError: Unexpected indentifier
As my understanding, you want to create a function that executes a method giving by name (second argument) on an object/variable, basically, you want to run js code from a string inside your function.
For that, you can use eval(str)
function that evaluates str
function applyMethodToVar(v, method){
// this solution is not guaranteed to work 100%
// and I am assuming that method returns something
let _ans;
eval(`_ans=${v+method}`);
console.log(_ans);
}
applyMethodToVar("hello", ".length"); // should return 5
but, I don’t recommend using eval at all, because it can lead to some serious security problems, see: https://developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Global_Objects/eval, so you need carefully verify your inputs
You would have to have “.length” instead of “length” here. Also, you can not use var
as a parameter name, because it is reserved in JavaScript. Also, you would have to wrap the variable in quotes or you will get an error. See my example above.
1 Like