Чтобы изменить вашу функцию `add` так, чтобы она возвращала результат только один раз в зависимости от глубины поиска, вы можете использовать флаг, чтобы отслеживать, добавлен ли уже новый элемент в структуру папок.
Вместо того чтобы рекурсивно продолжать обход вглубь всех дочерних папок, вам нужно прервать дальнейшие итерации, если нужная папка уже найдено и новый элемент добавлен. Вот как это можно сделать:
```javascript
import React, { useState, useEffect } from "react";
function Folders() {
const [getFolders, setFolders] = useState([{
"path": "/children",
"children": [{
"path": "/children/children_1",
"children": []
}]
}, {
"path": "/demo",
"children": []
}]);
const add = (get, set, path, added = false) => {
return get.map((folder) => {
if (added) {
// Если элемент уже добавлен, просто возвращаем папку без изменений
return folder;
}
if (folder.path === path) {
// Если нашли нужный путь, добавляем новые папки
folder.children = set;
// Устанавливаем флаг добавления в true
added = true;
} else if (folder.children.length) {
// Если есть дочерние элементы, продолжаем рекурсию
folder.children = add(folder.children, set, path, added);
}
return folder;
});
};
useEffect(() => {
const formData = new FormData();
formData.append('path', '/children/children_1');
fetch("*", {
method: "POST",
body: formData
}).then((response) => response.json()).then((data) => {
if (data.status === 'success') {
setFolders((result) => {
return add(result, data.folders, '/children/children_1');
});
}
});
}, []);
console.log(getFolders);
return '';
}
export default Folders;
```
### Изменения:
1. **Флаг добавления**: Добавлен параметр `added` в функцию `add`, который используется для отслеживания, было ли уже добавлено новое содержимое. Если оно было добавлено, функция просто возвращает текущий список папок без изменений.
2. **Условия**: Если совпадение по `path` найдено, `added` устанавливается в `true`, и дальнейшая рекурсия прекращается на следующих уровнях.
Этот подход позволяет гарантировать, что новый элемент будет добавлен только один раз, и не будет производиться лишних изменений в иерархии папок.