分享
三行代码  ›  专栏  ›  技术社区  ›  GirkovArpa

在给定完整数组的情况下,如何识别不完整数组中缺少哪些元素?

  •  1
  • GirkovArpa  · 技术社区  · 1 周前

    我正试图为这个问题写一个实用的解决方案。我已经有了一个解决方案,它使用循环和无递归的变异(我知道我下面尝试的是变异,我正试图避免这种情况)。

    请在下面的注释中查看预期输出。我要强调的是,元素不一定是唯一的,排序也不重要。

    const getNamesWhichFillHoles = (namesArrayWithHoles, namesArrayFilled, fillers = []) => {
      const holey = [...namesArrayWithHoles].filter(Boolean);
      const filled = [...namesArrayFilled].filter(Boolean);
      const fillerIndexInFilled = filled.findIndex(name => !holey.includes(name));
      if (fillerIndexInFilled === -1) return fillers;
      const filler = filled[fillerIndexInFilled];
      const fillerIndexInHoley = holey.findIndex(name => name == filler);
      fillers.push(filler);
      filled[fillerIndexInFilled] = null;
      holey[fillerIndexInHoley] = null;
      return getNamesWhichFillHoles(holey, filled, fillers);
    }
    
    const namesArrayWithHoles = ['Bob', null, null, 'Sue', null];
    const namesArrayFilled = ['Jim', 'Bob', 'Bob', 'Sam', 'Sue',];
    const fillerNames = getNamesWhichFillHoles(namesArrayWithHoles, namesArrayFilled);
    
    console.log(fillerNames); // [ 'Jim', 'Sam' ]
    // should be: [ 'Jim', 'Sam', 'Bob' ]
    2 回复  |  直到 1 周前
        1
  •  1
  •   Gorisanson    1 周前

    您可以执行以下操作:

    const namesArrayWithHoles = ['Bob', null, null, 'Sue', null];
    const namesArrayFilled = ['Jim', 'Bob', 'Bob', 'Sam', 'Sue'];
    
    const result = namesArrayFilled.reduce(
      (acc, elem) => {
        const index = acc[0].indexOf(elem);
        if (index != -1) {
          return [acc[0].slice(0, index).concat(acc[0].slice(index + 1)), acc[1]];
        }
        return [acc[0], acc[1].concat(elem)];
      },
      [namesArrayWithHoles, []]
    )[1];
    
    console.log(result);
        2
  •  0
  •   GirkovArpa    1 周前

    我找到了这个解决方案。它确实假设没有 null 因为那只是分散注意力。

    const getMissingValues = (partial, complete) => {
      const equals = a => b => b == a;
      const push = (arr, val, count) => count ? push([...arr, val], val, count - 1) : [...arr];
      return [...new Set(complete)].reduce((missing, val) => {
        const { length: a } = partial.filter(equals(val));
        const { length: b } = complete.filter(equals(val));
        const diff = (b - a);
        return push(missing, val, diff);
      }, []);
    }
    
    const partial = ['Bob', 'Sue'];
    const complete = ['Jim', 'Bob', 'Bob', 'Bob', 'Sue', 'Sue', 'Sam'];
    const missing = getMissingValues(partial, complete);
    
    console.log(missing); // [ 'Jim', 'Bob', 'Bob', 'Sue', 'Sam' ]