【问题标题】:js ternary operator: not returning falsy [duplicate]js三元运算符:不返回虚假[重复]
【发布时间】:2020-06-28 08:28:59
【问题描述】:

在第二个for...inif (map[t[i]]) 处使用断点单步执行,预期为false,但实际为true。有人可以帮助解释为什么会这样吗?

const s = 'rat',
  t = 'car';

const isAnagram = (s, t) => {
  if (s.length !== t.length) {
    return false;
  }

  const map = {};

  for (let i in s) {
    map[s[i]] ? map[s[i]]++ : (map[s[i]] = 1);
  }

  for (let i in t) {
    // this works
    // if (map[t[i]]) {
    //   map[t[i]]--;
    // } else {
    //   return false;
    // }

    // this doesn't ?¿?¿
    map[t[i]] ? map[t[i]]-- : false;
  }
  return true;
};

console.log(isAnagram(s, t)); // false

【问题讨论】:

  • 这个map[s[i]] ? map[s[i]]++ : map[s[i]] = 1; 是一种愚蠢和糟糕的做法。最好明确地这样做:map[s[i]] = map[s[i]] ? (map[s[i]]+1) : 1;
  • map[t[i]] ? map[t[i]]++ : false; 不会从函数返回。它只是产生值false,但你从不使用它。例如,这与执行 var a = 1; false; a += 1 相同 - false 是一个无关紧要的声明。
  • @VLAZ btw 我编辑为-- 而不是++。您如何将其重写为三进制?
  • 您不能将return 作为条件表达式的一部分。该运算符接受三个表达式,但return 是一个语句。它不能作为条件表达式的一部分嵌套。
  • @VLAZ 谢谢这更有意义 - 欣赏它!

标签: javascript conditional-operator


【解决方案1】:

const isAnagram = (s, t) => {
  const [sMap, tMap] = [s, t].map(
    str =>
    str.toLowerCase().replace(/\s/g, "").split("").reduce((map, cursor) => {
      map[cursor] = 1 + (map[cursor] ? map[cursor] : 0);
      return map;
    }, {})
  );

  return !Object.keys(sMap).some(prop => sMap[prop] !== tMap[prop]);
}

console.log(isAnagram("me", "hobo")); // false

// all true
console.log(isAnagram("rail safety", "fairy tales"));
console.log(isAnagram("debit card", "bad credit"));
console.log(isAnagram("William Shakespeare", "I am a weakish speller"));

【讨论】:

  • 是的,但假设rattar 是相互颠倒的,但不是因为anagramnagaram 等原因。
  • 谢谢。我误解了这个问题,我已经更新了代码
【解决方案2】:

您可以对字符串进行排序、过滤空格并进行比较:

const s = 'rat';
const t = 'tar'
const u = "cat";

isAnagram = (s, t) =>
  [...s].filter(c => c !== ' ').sort().join() === [...t].filter(c => c !== ' ').sort().join()
  
console.log(isAnagram(s, t))
console.log(isAnagram(s, u))

【讨论】:

  • 最好在对字母进行排序之前修剪/过滤掉空格,因此只检查与检查字谜无关的字谜字母而不是空格
  • 你是对的@NikosM!我编辑了。
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2016-07-09
  • 2021-10-17
  • 2013-12-04
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多