Как можно изменить функцию <i>add</i> так, чтобы она возвращала только один результат, вместо двух и более, в зависимости от глубины поиска? Я пробовал использовать асинхронные методы, но проблема не решилась. Вот мой код:
<pre><code class="typescript">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:any,set:any,path:string) =>{
return get.map((folder:any) => {
if(folder.children.length){
folder.children = add(folder.children,set,path);
}else if(folder.path==path){
folder.children = set;
}
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:any)=>{
return add(result,data.folders,'/children/children_1');
});
}
});
},[]);
console.log(getFolders);
return '';
}
export default Folders;</code></pre>
В результате выполнения кода я получаю следующее:
<pre><code>2:[
{"path": "/children","children": [
{"path": "/children/children_1","children": [
{"path": "/demo1","children": []}
]}
]},
{"path": "/demo","children": []}
]
2:[
{"path": "/children","children": [
{"path": "/children/children_1","
Чтобы изменить вашу функцию `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`, и дальнейшая рекурсия прекращается на следующих уровнях.
Этот подход позволяет гарантировать, что новый элемент будет добавлен только один раз, и не будет производиться лишних изменений в иерархии папок.