Coding practice
JavaScript Coding Questions
30 hands-on challenges with prompts and solution sketches for JavaScript interview rounds.
Challenge set
30 coding questions
1. Reverse a String
javascriptWrite a function that reverses a string.
function reverseString(str) {
return str.split("").reverse().join("");
} 2. Check Palindrome
javascriptReturn true if a string is a palindrome (ignore case and non-alphanumeric).
function isPalindrome(str) {
const clean = str.toLowerCase().replace(/[^a-z0-9]/g, "");
return clean === clean.split("").reverse().join("");
} 3. Find Largest Number
javascriptReturn the largest number in an array.
function findLargest(numbers) {
return Math.max(...numbers);
} 4. Remove Duplicates
javascriptRemove duplicate values from an array.
function removeDuplicates(arr) {
return [...new Set(arr)];
} 5. Count Vowels
javascriptCount vowels in a string.
function countVowels(str) {
return str.match(/[aeiou]/gi)?.length || 0;
} 6. FizzBuzz
javascriptPrint Fizz, Buzz, or FizzBuzz for multiples of 3 and 5.
function fizzBuzz(n) {
for (let i = 1; i <= n; i++) {
if (i % 15 === 0) console.log("FizzBuzz");
else if (i % 3 === 0) console.log("Fizz");
else if (i % 5 === 0) console.log("Buzz");
else console.log(i);
}
} 7. Factorial
javascriptCompute factorial recursively.
function factorial(n) {
if (n === 0) return 1;
return n * factorial(n - 1);
} 8. Fibonacci
javascriptReturn the first n Fibonacci numbers.
function fibonacci(n) {
const result = [0, 1];
for (let i = 2; i < n; i++) {
result.push(result[i - 1] + result[i - 2]);
}
return result.slice(0, n);
} 9. Flatten Array
javascriptFully flatten a nested array.
function flattenArray(arr) {
return arr.flat(Infinity);
} 10. Deep Clone Object
javascriptDeep clone a plain object/array value.
function deepClone(value) {
return structuredClone(value);
} 11. Debounce
javascriptImplement debounce.
function debounce(fn, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
} 12. Throttle
javascriptImplement throttle.
function throttle(fn, delay) {
let lastTime = 0;
return function (...args) {
const now = Date.now();
if (now - lastTime >= delay) {
lastTime = now;
fn.apply(this, args);
}
};
} 13. Memoization
javascriptMemoize a unary function.
function memoize(fn) {
const cache = {};
return function (value) {
if (cache[value] !== undefined) return cache[value];
cache[value] = fn(value);
return cache[value];
};
} 14. Curry Function
javascriptCurry a simple add function.
function curryAdd(a) {
return function (b) {
return a + b;
};
} 15. Group Array by Key
javascriptGroup objects by a property key.
function groupBy(items, key) {
return items.reduce((result, item) => {
const group = item[key];
if (!result[group]) result[group] = [];
result[group].push(item);
return result;
}, {});
} 16. Custom map()
javascriptImplement Array.prototype.customMap.
Array.prototype.customMap = function (callback) {
const result = [];
for (let i = 0; i < this.length; i++) {
result.push(callback(this[i], i, this));
}
return result;
}; 17. Custom filter()
javascriptImplement Array.prototype.customFilter.
Array.prototype.customFilter = function (callback) {
const result = [];
for (let i = 0; i < this.length; i++) {
if (callback(this[i], i, this)) result.push(this[i]);
}
return result;
}; 18. Custom reduce()
javascriptImplement Array.prototype.customReduce.
Array.prototype.customReduce = function (callback, initialValue) {
let accumulator = initialValue;
for (let i = 0; i < this.length; i++) {
accumulator = callback(accumulator, this[i], i, this);
}
return accumulator;
}; 19. Promise.all Polyfill
javascriptImplement a Promise.all-like helper.
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const results = [];
let completed = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise)
.then((value) => {
results[index] = value;
completed++;
if (completed === promises.length) resolve(results);
})
.catch(reject);
});
});
} 20. Event Emitter
javascriptBuild a minimal EventEmitter.
class EventEmitter {
constructor() {
this.events = {};
}
on(event, callback) {
if (!this.events[event]) this.events[event] = [];
this.events[event].push(callback);
}
emit(event, data) {
(this.events[event] || []).forEach((callback) => callback(data));
}
} 21. Check Anagram
javascriptCheck if two strings are anagrams.
function isAnagram(a, b) {
return a.split("").sort().join("") === b.split("").sort().join("");
} 22. Capitalize Words
javascriptCapitalize the first letter of each word.
function capitalizeWords(str) {
return str
.split(" ")
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ");
} 23. Find Missing Number
javascriptFind the missing number from 1..n.
function findMissingNumber(arr, n) {
const expected = (n * (n + 1)) / 2;
const actual = arr.reduce((sum, num) => sum + num, 0);
return expected - actual;
} 24. Count Occurrences
javascriptCount occurrences of each value.
function countOccurrences(arr) {
return arr.reduce((result, item) => {
result[item] = (result[item] || 0) + 1;
return result;
}, {});
} 25. Merge Objects
javascriptShallow-merge two objects.
function mergeObjects(a, b) {
return { ...a, ...b };
} 26. Safe JSON Parse
javascriptParse JSON safely and return null on failure.
function safeJsonParse(text) {
try {
return JSON.parse(text);
} catch {
return null;
}
} 27. Retry Async Function
javascriptRetry an async function N times.
async function retry(fn, attempts) {
for (let i = 0; i < attempts; i++) {
try {
return await fn();
} catch (error) {
if (i === attempts - 1) throw error;
}
}
} 28. Timeout Promise
javascriptCreate a delay promise.
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
} 29. Toggle Class
javascriptToggle an active class on an element.
function toggleActive(element) {
element.classList.toggle("active");
} 30. Validate Email
javascriptValidate a simple email pattern.
function validateEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}