Javascript code snippets
Array flattener
Implement a function flatten that returns a newly-created array with all sub-array elements concatenated recursively into a single level.
export default function flatten(value) {
if (!Array.isArray(value)) {
return [value];
}
let flattenedArray = [];
for (let i = 0; i < value.length; i++) {
if (Array.isArray(value[i])) {
flattenedArray = flattenedArray.concat(flatten(value[i]));
} else {
flattenedArray.push(value[i]);
}
}
return flattenedArray;
}
export default function flatten(value) {
if (!Array.isArray(value)) {
return [value];
}
let flattenedArray = [];
for (let i = 0; i < value.length; i++) {
if (Array.isArray(value[i])) {
flattenedArray = flattenedArray.concat(flatten(value[i]));
} else {
flattenedArray.push(value[i]);
}
}
return flattenedArray;
}
Deep equal
Implement a function deepEqual that performs a deep comparison between two values. It returns true if two input values are deemed equal, and returns false if not.
export default function deepEqual(a, b) {
// case - both values are same in type and value
if (a === b) {
return true;
}
// case - both values have different type
if (Array.isArray(a) !== Array.isArray(b)) {
return false;
}
// case - no value is null
if (
a === null ||
typeof a !== "object" ||
b === null ||
typeof b !== "object"
) {
return false;
}
const keysA = Object.keys(a);
const keysB = Object.keys(b);
// case - both objects have diff no of keys
if (keysA.length !== keysB.length) {
return false;
}
for (const k of keysA) {
// case - values of both keys are same
if (!keysB.includes(k) || !deepEqual(a[k], b[k])) {
return false;
}
}
return true;
}
export default function deepEqual(a, b) {
// case - both values are same in type and value
if (a === b) {
return true;
}
// case - both values have different type
if (Array.isArray(a) !== Array.isArray(b)) {
return false;
}
// case - no value is null
if (
a === null ||
typeof a !== "object" ||
b === null ||
typeof b !== "object"
) {
return false;
}
const keysA = Object.keys(a);
const keysB = Object.keys(b);
// case - both objects have diff no of keys
if (keysA.length !== keysB.length) {
return false;
}
for (const k of keysA) {
// case - values of both keys are same
if (!keysB.includes(k) || !deepEqual(a[k], b[k])) {
return false;
}
}
return true;
}
getElementsByClassName() Implementation
getElementsByClassName() is a method which exists on HTML Documents and Elements to return an HTMLCollection of descendant elements within the Document/Element which has the specified class name(s).
export default function getElementsByClassName(element, classNames) {
let elements = [];
const classes = new Set(classNames.trim().split(/\s+/));
function isSubset(a, b) {
return Array.from(a).every((cls) => b.contains(cls));
}
function traverse(el) {
// case - all nodes traversed
if (el == null) {
return;
}
// case - if element contains all classes
if (isSubset(classes, el.classList)) {
elements.push(el);
}
for (const child of el.children) {
traverse(child);
}
}
for (const ch of element.children) {
traverse(ch);
}
return elements;
}
export default function getElementsByClassName(element, classNames) {
let elements = [];
const classes = new Set(classNames.trim().split(/\s+/));
function isSubset(a, b) {
return Array.from(a).every((cls) => b.contains(cls));
}
function traverse(el) {
// case - all nodes traversed
if (el == null) {
return;
}
// case - if element contains all classes
if (isSubset(classes, el.classList)) {
elements.push(el);
}
for (const child of el.children) {
traverse(child);
}
}
for (const ch of element.children) {
traverse(ch);
}
return elements;
}
JSON.stringify
Implement a function jsonStringify, similar to JSON.stringify that converts a JavaScript value into a JSON string.
export default function jsonStringify(value) {
if (value === null) return "null";
let valueType = typeof value;
if (Array.isArray(value)) {
valueType = "array";
}
switch (valueType) {
case "array":
const allVals = value.map((v) => jsonStringify(v)).join(",");
return `[${allVals}]`;
case "object":
const objVals = Object.entries(value)
.map(([key, value]) => `"${key}":${jsonStringify(value)}`)
.join(",");
return `{${objVals}}`;
case "string":
return `"${value}"`;
default:
return String(value);
}
}
export default function jsonStringify(value) {
if (value === null) return "null";
let valueType = typeof value;
if (Array.isArray(value)) {
valueType = "array";
}
switch (valueType) {
case "array":
const allVals = value.map((v) => jsonStringify(v)).join(",");
return `[${allVals}]`;
case "object":
const objVals = Object.entries(value)
.map(([key, value]) => `"${key}":${jsonStringify(value)}`)
.join(",");
return `{${objVals}}`;
case "string":
return `"${value}"`;
default:
return String(value);
}
}