-
Notifications
You must be signed in to change notification settings - Fork 0
/
deep-map.js
40 lines (37 loc) · 1.21 KB
/
deep-map.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* Recursively applies a transformation function to all primitive values in a deeply nested data structure.
* @param {any} data - The data to be mapped.
* @param {Function} transform - The function to apply to each primitive value.
* @returns {any} - The transformed data structure.
*/
export function deepMap(data, transform) {
if (Array.isArray(data)) {
// If data is an array, map over each element
return data.map((item) => deepMap(item, transform));
} else if (data !== null && typeof data === "object") {
// If data is an object, map over each key-value pair
const result = {};
for (const [key, value] of Object.entries(data)) {
result[key] = deepMap(value, transform);
}
return result;
} else {
// Apply transformation to primitive values
return transform(data);
}
}
// Example usage
const data = {
name: "John",
age: 30,
address: {
city: "New York",
zip: 10001,
coordinates: [40.7128, 74.006],
},
hobbies: ["reading", "traveling"],
};
// Transformation function: e.g., convert all strings to uppercase
const transform = (value) =>
typeof value === "string" ? value.toUpperCase() : value;
export const transformedData = deepMap(data, transform);