Reputation: 31
I am very new to algorithm and programming in general. I may require more explanation than an average fellow. Apologies in advance.
My aim is to Create a function that returns a number, based on the string provided. I have been told that this can be done using loops. I believe my errors lies in the if statement. However, cant seem to figure it out. I would be glad if somebody could help.
function word(s) {
let str = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"];
let int = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
for (let j = 0; j < int.length; j++) {
for (let i = 0; i < str.length; i++) {
if (s === str[i]) {
return int[j]
}
}
}
}
Upvotes: 1
Views: 721
Reputation: 27242
Working Demo :
function getStringNumber(word) {
let str = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"];
let int = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
for (let i = 0; i < str.length; i++) {
if (word === str[i]) return int[i];
}
}
console.log(getStringNumber('nine') ?? 'No word found!');
Upvotes: 1
Reputation: 3729
Another option is to make use of the Map object, which allows the creation of a list of key-value pairs. Then, if the key is known, the value can immediately be gotten.
Under the hood this usually done via a hashing algorithm on the key, in which case the lookup for the key does not involve looping through all keys, but instead generates the hash from the key, a hash which is then used to directly find the value in the list. (It's a bit more complicated than that, but you can find out more by searching on array hashing techniques.)
So, the first step is to initialize the Map object by mapping the written version of the number as the key to the actual value of the number.
Then, once this mapping is created, for every instance where the lookup is required, it simply involves getting the value from the map.
function createMap( keyArray, valueArray ) {
let map = new Map();
for ( let i = 0; i < keyArray.length; i++ ) {
map.set( keyArray[ i ], valueArray[ i ] );
}
return map;
}
let myMap = createMap(
["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
)
console.log( myMap.get( "four" ) );
console.log( myMap.get( "two" ) );
This then has the distinct advantage of directly returning the value corresponding to the key without having to search the list of keys every time...
Upvotes: 0
Reputation: 8135
Actually, You dont need loop also. You can rearrange the strings and return the index based on the arrangement of the word in array.
const str = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
function word(s) {
return str.indexOf(s);
}
console.log(word("five"))
// In case you dont want to change order
function word1(s) {
const str = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"];
const index = str.indexOf(s);
return index < 9 ? index+1 : 0
}
console.log(word1("five"))
console.log(word1("zero"))
// Other way get index ussing findIndex
function word2(s) {
return str.findIndex(item => item === s);
}
console.log(word2("five"))
// Other using single loop
function word3(s) {
for (let i in str) {
if (str[i] === s) return i;
}
// Incase not found
return -1;
}
console.log(word3("five"))
Upvotes: 0
Reputation: 365
Essentially what you're looking to do is get the index of the input s
in your str
array, and return the item at the same index in your int
array. You could accomplish this with just the one loop:
function word(s) {
let str = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"];
let int = [1,2,3,4,5,6,7,8,9,0];
for (let j = 0; j < int.length; j++){
if (s === str[j]){
return int[j]
}
}
}
Of course, this is reliant upon the order of values matching up in your str
and int
arrays.
Upvotes: 1
Reputation: 386883
You need only a single loop to find the index of the given word. If found return the value form the other array by using the actual index.
for (let i = 0; i < str.length; i++){
if (s === str[i]) return int[i];
}
A short approach could use Array#lastIndexOf
.
Upvotes: 0