代码之家  ›  专栏  ›  技术社区  ›  Shubham Aswal

javascript reduce()、keys()、filter()方法

  •  0
  • Shubham Aswal  · 技术社区  · 3 月前

    在解决从数组中查找缺失数字的问题时。

    let arr = [15,3,5,6,7,2,1,8,12];
    
    let findMissing = (arr)=>{
        let res = arr.reduce((acc,n)=>{
            acc[n]=1;
            return acc;
        },[])
        
        return [...res.keys()].filter((i)=>{
            if(res[i]!==1) return i
        })
    }
    
    console.log(findMissing(arr));

    输出:[4,9,10,11,13,14]

    问题是为什么输出中没有零:[0,4,9,11,13,14]

    1 回复  |  直到 3 月前
        1
  •  4
  •   TheWuif    3 月前

    因为你回来了 i 在filter方法中(返回0)。 i === 0 && 0 == false 它会被过滤掉,因为当为filter函数返回一个错误值时,它会将其剥离。

    如果你回来 true 就像在我的例子中一样。

    let arr = [15,3,5,6,7,2,1,8,12];
    
    let findMissing = (arr)=>{
        let res = arr.reduce((acc,n)=>{
            acc[n]=1;
            return acc;
        },[])
        
        return [...res.keys()].filter((i)=>{
            return res[i] !== 1
        })
    }
    
    console.log(findMissing(arr));
        2
  •  0
  •   Carsten Massmann    3 月前

    可替换地, findMissing() 可以写成一行,使用 .reduce() .includes() :

    let arr = [15,3,5,6,7,2,1,8,12];
    
    let findMissing=arr=>
      Array(Math.max(...arr)+1).fill(0)
      .reduce((a,_,i)=>(!arr.includes(i)&&a.push(i),a),[]);
    
    console.log(findMissing(arr));

    但是,可以通过创建一个集来提高性能 s 从…起 arr 具有 s=new Set(arr) 然后使用 !s.has(i) 而不是 !arr.includes(i) 内部 reduce() 回调函数。

    什么时候 sort() 最初初始化数组时,我们可以不使用 .includes() .has() :

    let arr = [15,3,5,6,7,2,1,8,12];
    
    let findMissing=arr=>{ let i=0;
      return [...arr].sort((a,b)=>a-b)
      .reduce((a,v)=>{
        while(i<v) a.push(i++);
        ++i;
        return a},[]);
    }
    
    console.log(findMissing(arr));