You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何用map遍历数组时不显示第一个元素?

问题描述

从后端获取到如下数组:

[  
  {
    id: 0,
    name: "John",
    language: "English" 
  },
  {
    id: 1,
    name: "Chris",
    language: "Spanish" 
  },
  {
    id: 2,
    name: "Bastian",
    language: "German" 
  }
]

需求是将数组中对象的language字段渲染到表格中,通过map遍历实现,但不显示第一个对象的条目。尝试用shift()方法移除第一个元素时,报错:TypeError: lang.language.shift is not a function。

相关代码如下:

Parent.js

const [language, setLanguage] = useState([])

useEffect(() => {
 axios
    .get('api').then((res) => {setLanguage(response.data.languages)})
}, [])

Child.js

return(
       {language.map((lang, i) => {
           return (
               <tr key={"item-" + i}>
                  <td>
                    <div>
                       <input
                          type="text"
                          value={
                            lang.language
                              ? lang.language.shift()
                              : lang.language
                          }
                      </div>                 
                    </td>
                </tr>
          ))}
)

解决方案

报错原因

lang.language是字符串类型(比如"English"),而shift()是数组专属方法,只能用于数组,所以直接调用会触发类型错误。你错误地把单个对象的language属性当成数组来操作了。

正确实现方式

要跳过第一个元素,有两种简单可行的方法:

  1. 遍历前截取数组(推荐)
    在map之前,用slice(1)截取数组从索引1开始的部分,直接遍历处理后的子数组,自然不会包含第一个元素:
// Child.js 修改后代码
return(
       {language.slice(1).map((lang, i) => {
           return (
               <tr key={"item-" + (i + 1)}> {/* 用原数组索引作为key,避免重复 */}
                  <td>
                    <div>
                       <input
                          type="text"
                          value={lang.language}
                      </div>                 
                    </td>
                </tr>
          ))}
)

slice(1)不会修改原数组,只是返回新的子数组,不会影响状态中的原始数据,更符合React状态管理的规范。

  1. 遍历中判断索引跳过
    在map遍历的时候,判断当前元素的索引i,如果是0就直接返回null跳过渲染:
// Child.js 修改后代码
return(
       {language.map((lang, i) => {
           if (i === 0) return null; // 跳过第一个元素
           return (
               <tr key={"item-" + i}>
                  <td>
                    <div>
                       <input
                          type="text"
                          value={lang.language}
                      </div>                 
                    </td>
                </tr>
          ))}
)

另外注意Parent.js里的小bug:then((res) => {setLanguage(response.data.languages)})应该改成then((res) => {setLanguage(res.data.languages)}),参数是res不是response。

内容的提问来源于stack exchange,提问作者john_1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:20:28