Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应:需要更快的方式过滤数据并设置状态_Javascript_Node.js_Reactjs_React Redux_React Router - Fatal编程技术网

Javascript 反应:需要更快的方式过滤数据并设置状态

Javascript 反应:需要更快的方式过滤数据并设置状态,javascript,node.js,reactjs,react-redux,react-router,Javascript,Node.js,Reactjs,React Redux,React Router,我需要为一个餐馆应用程序制作一个菜单列表,菜单数据分类为美国、中国、印度、意大利。我需要循环所有这些,以在scrollspy类型菜单中以某种方式呈现它。 为此,我已将后端配置为一次发送所有项目,并需要根据react端的类别对其进行筛选和排序 数据结构: { _id: 5eef61450bd95e1f5c8f372f name: "Burger" category: "American" price: "100"

我需要为一个餐馆应用程序制作一个菜单列表,菜单数据分类为美国、中国、印度、意大利。我需要循环所有这些,以在scrollspy类型菜单中以某种方式呈现它。 为此,我已将后端配置为一次发送所有项目,并需要根据react端的类别对其进行筛选和排序

数据结构:

{
   _id: 5eef61450bd95e1f5c8f372f
   name: "Burger"
   category: "American"
   price: "100"
   isVeg: false
   __v: 0
}
我现在的方式似乎太慢了,我相信有一种更快/更有效的方式。请建议,因为我的方式让我想呕吐

const CheckForms = () => {
    const [american, setAmerican] = useState([]);
    const [italian, setItalian] = useState([]);
    const [indian, setIndian] = useState([]);
    const [chinese, setChinese] = useState([]);
    
    const fetchList = async () => {
        try {
            const res =  await axios.get(`http://localhost:5000/api/items`);
            const list =  res.data.response;  
            let ch = [];
            let ind = [];
            let am = [];
            let it = [];
            list.forEach(function(each){
                if (each.category === "Chinese") ch.push(each)
                else if (each.category === "Indian") ind.push(each)     
                else if (each.category === "American") am.push(each)     
                else if (each.category === "Italian") it.push(each)     
                else console.log('undefined category');
            });
            setAmerican(am);
            setIndian(ind);
            setChinese(ch);
            setItalian(it);
        } catch (err) {
            console.log(err.response);
        };
    };
    useEffect(()=> {
        fetchList();
    }, []);

    let render;
    if (indian.length > 0 && american.length > 0 && chinese.length > 0 && italian.length > 0) {
        render = (
            /*********************************
             *  AND FURTHER RENDERING LOGIC :( 
             ********************************/
        );
    };
您可以尝试减少:

const list=[
{类别:'Chinese',名称:'one-1'},
{类别:'Chinese',名称:'one-2'},
{类别:'印第安人',名称:'两'},
];
const groups=list.reduce(
(结果,项目)=>
结果集(
项目.类别,
(result.get(item.category)| |[]).concat(item)
),
新地图()
);
console.log('Chinese',groups.get('Chinese');

console.log('Indian',groups.get('Indian')迭代数组并过滤到“容器”或类别中是一个
O(n)
操作,您在那里做不了多少事情来加快它。您是否只是有一种“预感”,认为它可以更快(或更高效),或者您对上面的代码有实际的性能问题?据我所知,这里唯一的“改进”来自可读性和/或代码维护(即,如果需要添加/删除类别)@HMR的解决方案具有更高的复杂性,
O(n^2)
,因为内部数组::concat,但允许通过使用映射自动处理此类别。