【问题标题】:applying map function works while foreach function doesnt reactjs应用地图功能有效,而 foreach 功能不起作用
【发布时间】:2019-07-31 13:56:03
【问题描述】:

我有一个反应应用程序,它使用 map 函数显示嵌套 json 中的项目,但是其中一个类别可能是空的,这会使整个应用程序崩溃,我已经使用每个函数的 js 测试了相同 json 的 foreach 函数,它完美运行,我正在尝试翻译相同的逻辑来解决空类别问题。

这是我在同一个 json 上的每个测试,但带有列表:

测试1

let obj = {
  "name": "Menu",
  "children": [
    {
      "type": "category",
      "name": "Burgers",
      "children": [
        {
          "type": "item",
          "name": "Burger 1",
          "children": [
            {
              "type": "modifier",
              "name": "Promo",
              "children": [
                {
                  "type": "item",
                  "name": "Promo 1"
                }
              ]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [
                {
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [
                {
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Tomato"
                },
                {
                  "type": "ingredient",
                  "name": "Pickles"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Burger 2",
          "children": [
            {
              "type": "modifier",
              "name": "Promo",
              "children": [
                {
                  "type": "item",
                  "name": "Promo 1"
                }
              ]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [
                {
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [
                {
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Tomato"
                },
                {
                  "type": "ingredient",
                  "name": "Pickles"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Coming Soon Offers"
        }
      ]
    },
    {
      "type": "category",
      "name": "Pizzas",
      "children": [
        {
          "type": "item",
          "name": "Pizza 1",
          "children": [
            {
              "type": "modifier",
              "name": "Promo",
              "children": [
                {
                  "type": "item",
                  "name": "Promo 1"
                }
              ]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [
                {
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [
                {
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Mashrooms"
                },
                {
                  "type": "ingredient",
                  "name": "Olives"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Pizza 2",
          "children": [
            {
              "type": "modifier",
              "name": "Promo",
              "children": [
                {
                  "type": "item",
                  "name": "Promo 1"
                }
              ]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [
                {
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [
                {
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Mashrooms"
                },
                {
                  "type": "ingredient",
                  "name": "Olives"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
let body = document.querySelector('body');
function print(obj){
  let str = `<li>${obj.name}</li>`;
  if(obj.children){
    str += '<ul>' 
    for(let c of obj.children) str += print(c)
    str += '</ul>'
  }
  return str;
}
document.body.innerHTML = print(obj);

测试 2

const buildMenu = (data) => {
  let ul = document.createElement('ul');
  data.children.forEach(i => {
    let li = document.createElement('li');
    li.innerText = i.name;
    li.className = i.type;
    if (i.children) li.appendChild(buildMenu(i));
    ul.appendChild(li);
  });

  return ul;
};

let data = {

  "name": "Menu",
  "children": [{
      "type": "category",
      "name": "Burgers",
      "children": [{
          "type": "item",
          "name": "Burger 1",
          "children": [{
              "type": "modifier",
              "name": "Promo",
              "children": [{
                "type": "item",
                "name": "Promo 1"
              }]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [{
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [{
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Tomato"
                },
                {
                  "type": "ingredient",
                  "name": "Pickles"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Burger 2",
          "children": [{
              "type": "modifier",
              "name": "Promo",
              "children": [{
                "type": "item",
                "name": "Promo 1"
              }]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [{
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [{
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Tomato"
                },
                {
                  "type": "ingredient",
                  "name": "Pickles"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Coming Soon Offers"
        }
      ]
    },
    {
      "type": "category",
      "name": "Pizzas",
      "children": [{
          "type": "item",
          "name": "Pizza 1",
          "children": [{
              "type": "modifier",
              "name": "Promo",
              "children": [{
                "type": "item",
                "name": "Promo 1"
              }]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [{
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [{
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Mashrooms"
                },
                {
                  "type": "ingredient",
                  "name": "Olives"
                }
              ]
            }
          ]
        },
        {
          "type": "item",
          "name": "Pizza 2",
          "children": [{
              "type": "modifier",
              "name": "Promo",
              "children": [{
                "type": "item",
                "name": "Promo 1"
              }]
            },
            {
              "type": "group",
              "name": "Drinks",
              "children": [{
                  "type": "item",
                  "name": "Coke"
                },
                {
                  "type": "item",
                  "name": "Light Coke"
                },
                {
                  "type": "item",
                  "name": "Sprite"
                },
                {
                  "type": "item",
                  "name": "Fanta"
                }
              ]
            },
            {
              "type": "modifier",
              "name": "Without",
              "children": [{
                  "type": "ingredient",
                  "name": "Onion"
                },
                {
                  "type": "ingredient",
                  "name": "Mashrooms"
                },
                {
                  "type": "ingredient",
                  "name": "Olives"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
};

document.body.appendChild(buildMenu(data));

【问题讨论】:

    标签: javascript json reactjs ecmascript-6 foreach


    【解决方案1】:

    您在多个地方缺少对象空检查。

    1. 在您的ItemList 组件的渲染函数中有一个 else 语句,您可以在其中分配 selectedChild 和 selectedItem。您需要检查 activelist.childrenselectedChild.children 是否为空
       const selectedChild = activelist.children.length ? activelist.children[this.state.selected] : null;
       const selectedItem = selectedChild.children && selectedChild.children.length
            ? selectedChild.children[this.state.itemSelected]: null;
    
    1. 要渲染 selectedChild,您应该检查 children 是否为空。
    {
      selectedChild &&
      selectedChild.children &&
      selectedChild.children.length &&
      selectedChild.children.map(
        (item, index) => (
          <Item
            className="person"
            key={index}
            Title={item.name}
            onClick={this.handleClick}
            index={index}
          />
       )
    )}
    
    1. 要渲染 selectedItem,您应该检查 children 是否为空
    <div>
      { selectedItem &&
        selectedItem.children &&
        selectedItem.children.map((item, index) => (
          <Modifiers
            key={index}
            title={item.name}
            myKey={index}
            options={item.children}
            childk={item.id}
           />
         ))
      }
    </div>
    <div>
      { 
        selectedItem &&
        selectedItem.size &&
        (<div>
            <Size
               options={selectedItem.size}
               sizetitle={"Size"}
            />
           </div>)
       }
    </div>
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多