Overview
Implement classnames(...args) that handles:
- Strings, numbers (as class names)
- Objects (keys with truthy values)
- Deeply nested arrays
- Falsy values are skipped
Constraints
- Handle arbitrary nesting depth
- Numbers are valid class names
- toString() is not called on objects
Examples
classnames('a', [[[['b']]]], { c: true, d: 0 }, 1); // 'a b c 1'Solution
Reveal solution
function classnames(...args) {
const classes = [];
for (const arg of args) {
if (!arg && arg !== 0) continue;
if (typeof arg === 'string' || typeof arg === 'number') classes.push(arg);
else if (Array.isArray(arg)) { const nested = classnames(...arg); if (nested) classes.push(nested); }
else if (typeof arg === 'object') {
for (const [k, v] of Object.entries(arg)) { if (v) classes.push(k); }
}
}
return classes.join(' ');
}classnames-ii.js
Classnames II
hardcodingJavaScriptStrings
Overview
Implement classnames(...args) that handles:
- Strings, numbers (as class names)
- Objects (keys with truthy values)
- Deeply nested arrays
- Falsy values are skipped
Constraints
- Handle arbitrary nesting depth
- Numbers are valid class names
- toString() is not called on objects
Examples
classnames('a', [[[['b']]]], { c: true, d: 0 }, 1); // 'a b c 1'Solution
Reveal solution
function classnames(...args) {
const classes = [];
for (const arg of args) {
if (!arg && arg !== 0) continue;
if (typeof arg === 'string' || typeof arg === 'number') classes.push(arg);
else if (Array.isArray(arg)) { const nested = classnames(...arg); if (nested) classes.push(nested); }
else if (typeof arg === 'object') {
for (const [k, v] of Object.entries(arg)) { if (v) classes.push(k); }
}
}
return classes.join(' ');
}NameTopicDifficulty
103 of 103 problems