type Person = { name: string; salary: number };
type Department = Person[] | { [key: string]: Person[] | Department };
type Company = { [key: string]: Department };
 
const company: Company = {
  sales: [
    { name: "John", salary: 1000 },
    { name: "Alice", salary: 500 },
  ],
  development: {
    sites: [
      { name: "Peter", salary: 1000 },
      { name: "Alex", salary: 200 },
    ],
    internals: {
      first: [{ name: "Ron", salary: 300 }],
      second: [{ name: "Bob", salary: 300 }],
    },
  },
  management: {
    sales: [{ name: "Alex", salary: 900 }],
    development: [{ name: "Jack", salary: 600 }],
  },
};
 
export default function App() {
  // Отобразить company виде дерева подразделений
  // Для каждого подразделения указать сумму зарплат работников
  // Пример:
  // company: 23
  // - sales: 11
  // - development: 12
  //      internals: 6
  //        first: 3
  //        second: 3
 
  return (
    <div className="App">
      <h1>Hello world!</h1>
    </div>
  );
}

**Ответ

import React from 'react';
 
type Person = { name: string; salary: number };
type Department = Person[] | { [key: string]: Person[] | Department };
type Company = { [key: string]: Department };
 
const company: Company = {
  sales: [
    { name: "John", salary: 1000 },
    { name: "Alice", salary: 500 }
  ],
  development: {
    sites: [
      { name: "Peter", salary: 1000 },
      { name: "Alex", salary: 200 }
    ],
    internals: {
      first: [{ name: "Ron", salary: 300 }],
      second: [{ name: "Bob", salary: 300 }]
    }
  },
  management: {
    sales: [{ name: "Alex", salary: 900 }],
    development: [{ name: "Jack", salary: 600 }]
  }
};
 
function calculateSalary(department: Department): number {
  if (Array.isArray(department)) {
    return department.reduce((total, person) => total + person.salary, 0);
  } else {
    return Object.values(department).reduce((total, subDepartment) => total + calculateSalary(subDepartment), 0);
  }
}
 
function renderDepartment(departmentName: string, department: Department): React.ReactNode {
  if (Array.isArray(department)) {
    const totalSalary = calculateSalary(department);
    return (
      <div key={departmentName}>
        {departmentName}: {totalSalary}
      </div>
    );
  } else {
    return (
      <div key={departmentName}>
        {departmentName}: {calculateSalary(department)}
        {Object.entries(department).map(([subDepartmentName, subDepartment]) =>
          renderDepartment(subDepartmentName, subDepartment)
        )}
      </div>
    );
  }
}
 
export default function App() {
  return (
    <div className="App">
      <h1>Hello world!</h1>
      {Object.entries(company).map(([departmentName, department]) =>
        renderDepartment(departmentName, department)
      )}
    </div>
  );
}

Назад