Skip to content

2823. Deep Object Filter 👍

 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
type JSONValue =
  | null
  | boolean
  | number
  | string
  | JSONValue[]
  | { [key: string]: JSONValue };
type Obj = JSONValue | Record<string, JSONValue> | Array<JSONValue>;

function deepFilter(obj: Obj, fn: (x: JSONValue) => boolean): Obj | undefined {
  if (Array.isArray(obj)) {
    const filteredArr = obj
      .map((item) => deepFilter(item, fn))
      .filter((item) => item !== undefined);
    return filteredArr.length > 0 ? filteredArr : undefined;
  }

  if (typeof obj === 'object' && obj !== null) {
    const filteredObj: Record<string, JSONValue> = {};
    for (const key in obj) {
      const filteredValue = deepFilter(obj[key], fn);
      if (filteredValue !== undefined) {
        filteredObj[key] = filteredValue;
      }
    }
    return Object.keys(filteredObj).length > 0 ? filteredObj : undefined;
  }

  return fn(obj) ? obj : undefined;
}