代码之家  ›  专栏  ›  技术社区  ›  user944513

为什么映射函数在迭代时给出未定义?

  •  0
  • user944513  · 技术社区  · 7 年前
    const a=[{name:'ee'},{name:"ddsf"}]
    const b=a.map(({name})=>{
      if(name!='ee')
      return {
        key:'dd',
        name:name +'sss'
      }
    })
    
    console.log(b)
    

    我越来越

    [undefined, [object Object] {
      key: "dd",
      name: "ddsfsss"
    }]
    

    为什么? ?

    预期产量

    [[object Object] {
      key: "dd",
      name: "ddsfsss"
    }]
    

    这是代码 https://jsbin.com/wujekavivo/edit?html,js,console,output

    2 回复  |  直到 7 年前
        1
  •  1
  •   ziggy wiggy    7 年前

    你想要 .filter 之前 .map .

    const b = a.filter(o => o.name != 'ee')
      .map(o => ({
          key: 'dd',
          name: o.name + 'sss'
        })
      );
    

    这是因为

    你也可以使用 .reduce() 同时完成两者。

    const b = a.reduce((o, acc) => 
        o.name == 'ee' ? acc : acc.concat({
          key: 'dd',
          name: o.name + 'sss'
        })
    , []);
    
        2
  •  1
  •   justelouise    7 年前

    这个 map 函数返回与迭代到的数组对应的数组。所以 undefined name: 'ee' . 如果你只想得到那些名字!='呃,你可以用 filter 相反或者更好的是,你可以:

    a.reduce((arr, {name}) => {
      if(name === 'ee') {
        arr.push({
          key: 'dd',
          name: name + 'sss',
        });
      }
      return arr;
    }, []);
    

    不像 地图 , reduce 你几乎有更多的控制权。