【问题标题】:Comparison operator is not working on 0 in JavaScript比较运算符不适用于 JavaScript 中的 0
【发布时间】:2021-03-30 06:11:06
【问题描述】:

我一直在尝试回答这个偶然发现 Codewars 的问题。

给你一个包含整数的数组(长度至少为 3,但可能非常大)。数组要么完全由奇数组成,要么完全由偶数组成,除了单个整数 N。编写一个将数组作为参数并返回此“异常值”N 的方法。

这是我最初的回答。

let array = [0, 1, 2];

function findOutlier(integers) {
  let evens = integers.filter(item => {
    if (item % 2 === 0 || item === 0) {
      return item;
    }
  });
  let odds = integers.filter(item => {
    if (item % 2 !== 0) {
      return item;
    }
  });
  if (evens.length > 1) {
    return odds[0];
  } else {
    return evens[0];
  }
}
console.log(findOutlier(array));

但显然 item === 0 在上面的代码中不起作用,它返回 [2] 作为 evens 的值(漏掉 0 个)。 然后我像下面这样更改了代码,它可以工作了!

let array = [0, 1, 2];

function findOutlier(integers) {
  let evens = integers.filter(item => {
    if (item = 0 || item % 2 === 0) {
      return item;
    }
  });
  let odds = integers.filter(item => {
    if (item % 2 !== 0) {
      return item;
    }
  });
  if (evens.length > 1) {
    return odds[0];
  } else {
    return evens[0];
  }
}
console.log(findOutlier(array));

我仍然很困惑为什么比较运算符在第一个代码中不起作用。 非常感谢您能帮助我理解..!

【问题讨论】:

  • 过滤器应该返回一个布尔值而不是一个整数。整数 0 被认为是错误的,这会导致您的错误行为。此外, 0 mod 2 === 0 所以第二次检查是多余的。 item = 0 是赋值,而不是比较。此外,您可以通过在 O(1) 内存中仅迭代一次数组来解决此任务(除了输入)。

标签: javascript comparison-operators


【解决方案1】:

问题出在这里

let evens = integers.filter(item => {
    if (item = 0 || item % 2 === 0) {
      return item; // You are return value instead of boolean
    }
});

应该是

let evens = integers.filter(item => {
    return item == 0 || item % 2 == 0; // It should be returned boolean
});

只是因为根据MDN's filter method 这么说:

回调函数是一个谓词,用来测试数组的每个元素。 返回一个强制true 保留元素的值,或者返回false 否则`。

let array = [0, 1, 2];

function findOutlier(integers){
    let evens = integers.filter(item => {
        return item == 0 || item % 2 == 0;
    });
    let odds = integers.filter(item => {
        return item % 2 !== 0;
    });
    
    if(evens.length > 1) {
        return odds[0];
    } else {
        return evens[0];
    }
}
console.log(findOutlier(array));

优化性能

function findOutlier(integers){
   const result = integers.reduce((acc, curr) => {
      if(curr % 2 === 0)
        acc["evens"].push(curr);
      else
        acc["odds"].push(curr);
      return acc;
    }, { evens: [],  odds: []});
    
   return result["evens"].length > 1 ? result["odds"][0] : result["evens"][0];
}
console.log(findOutlier([0, 1, 2]));

【讨论】:

  • 抱歉回复晚了..!比你这么多,它真的帮助了我,特别是你解释说我返回的值不是布尔值。再次非常感谢你
  • 是的。很高兴能帮到你^^!
【解决方案2】:

.filter() 方法接收的谓词必须返回布尔值 truefalse,而不是 item。这是第一个错误。第二个是在if 条件内使用赋值=。单个等号不代表比较。

要解决此问题,您可以在第一个代码示例中将 return item 替换为 return true。不过,我建议您使用简单的循环。

function findOutlier(integers) {
  for (let item of integers) {
    if (item % 2 != 0) {
      return item;
    }
  }
  return integers[0];
}

【讨论】:

    【解决方案3】:

    filter 方法中,您需要返回truefalse,而您正在返回value。在第一种情况下,0 将根据您的代码返回,0 被视为falsy 值。所以它不会显示在最终结果中。

    let array = [0, 1, 2];
    
    function findOutlier(integers) {
      let evens = integers.filter((item) => {
        if (item % 2 === 0) {
          return true;
        }
        return false;
      });
    
      console.log(evens);
    
      let odds = integers.filter((item) => {
        if (item % 2 !== 0) {
          return true;
        }
        return false;
      });
    
      console.log(odds);
    
      if (evens.length > 1) {
        return odds[0];
      } else {
        return evens[0];
      }
    }
    console.log(findOutlier(array));

    你可以把这段代码更readable如下sn-p所示

    let array = [0, 1, 2];
    
    function findOutlier(integers) {
      let evens = integers.filter(item => item % 2 === 0);
      let odds  = integers.filter(item => item % 2 !== 0);
    
      if (evens.length > 1) return odds[0];
      else return evens[0];
    }
    
    console.log(findOutlier(array));

    【讨论】:

    • 抱歉重播晚了,非常感谢您的帮助!!我不知道我应该在过滤器方法中返回布尔值..!我会记住这一点,哇,您的代码确实看起来更具可读性。再次感谢您
    • 很高兴,我能帮上忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2012-01-26
    相关资源
    最近更新 更多