Как можно заставить функцию в React возвращать результат только один раз?

Как можно изменить функцию <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) =&gt;{
		return get.map((folder:any) =&gt; {
			if(folder.children.length){
				folder.children = add(folder.children,set,path);
			}else if(folder.path==path){
				folder.children = set;
			}
			return folder;
		});
	}
	useEffect(() =&gt; {
		const formData = new FormData();
		formData.append('path','/children/children_1');
		fetch("*", {
			method: "POST",
			body: formData
		}).then((response) =&gt; response.json()).then((data) =&gt; {
            if(data.status==='success'){
                setFolders((result:any)=&gt;{
                    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","
  • 8 января 2025 г. 18:13
Ответы на вопрос 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`, и дальнейшая рекурсия прекращается на следующих уровнях.

Этот подход позволяет гарантировать, что новый элемент будет добавлен только один раз, и не будет производиться лишних изменений в иерархии папок.
Похожие вопросы