【问题标题】:Checking to see if this Javascript code is 'DRY' or inefficient [closed]检查此 Javascript 代码是否“干燥”或效率低下 [关闭]
【发布时间】:2019-08-09 20:06:12
【问题描述】:

我做了一个 JS 练习,我需要从一串数字创建一个回文。它有效,但我确信有一种更简洁的方法可以实现这一点。

来自edabit.com的方向:

一个数字可能不是回文,但它的后代可以是。通过将每对相邻数字相加以创建下一个数字的数字来创建数字的直接子代。创建一个函数,如果数字本身是回文数或其任何后代,则返回 true 到 2 位数

function palindromeDescendant(input) {

  let newStr = input;
  let newRevStr = (""+input).split('').reverse().join('');

  checkEquality(newStr, newRevStr);

  function checkEquality(a, b) {

    if (a != b && (""+a).split('').length >= 2) {
      sumPair(a);
    } else if (a != b) {
        result = `${false}: ${a}`;
    } else {
      result = `${true}: ${a}`;
    }
  }

  function sumPair(nums) {
    const a = (""+nums).split('').map(Number);
    let b = [];

    for (let i = 0; i < a.length -1; i++) {
      b.push(a[i] + a[i + 1]);
      i++
    }
    newStr = b.join('');
    newRevStr = newStr.split('').reverse().join('');
    checkEquality(newStr, newRevStr);
  }
  return result;
}

【问题讨论】:

  • 如果该函数有效并且您正在寻找更好的编写方法的建议,Code Review 是发帖的合适位置。
  • 代码显然是 DRY。您在哪里看到任何重复的代码?
  • 我投票结束这个问题,因为代码审查不属于 Stack Overflow。它应该发布在:codereview.stackexchange.com

标签: javascript palindrome


【解决方案1】:

您的 result 是一个隐式全局变量,这是不好的做法。在严格模式下运行时,您的脚本会抛出错误

Uncaught ReferenceError: 结果未定义

你在很多地方都使用了(""+value).split(''),所以可以把它移到一个可重用的函数中。

newStr 最初实际上是一个数字,而不是字符串。将不同的类型重新分配给单个变量是不好的,原因有两个:它会使阅读您的代码的程序员感到困惑,并且还会因为变量类型的不一致而使您的代码不优化。

您的checkEquality() 没有按照它声称的那样做。除了检查相等外,它还检查字符串形式的值的长度是否大于或等于 2。您应该确保在编写函数时,它们的实际操作与其名称所暗示的意图一致。

最后,您的sumPair() 可以通过仅在for 语句中增加i 来略微改进以提高可读性(这导致我最初对您的实现和关于“无限增长”的评论感到困惑)。

将所有这些放在一起,您可以编写如下所示的实现:

function toStringArray (value) {
  return value.toString().split('');
}

function reverseString (value) {
  return value.split('').reverse().join('');
}

function sumPairs (value) {
  const array = toStringArray(value).map(Number);
  const pairs = [];

  for (let i = 0; i < array.length - 1; i += 2) {
    pairs.push(array[i] + array[i + 1]);
  }

  return pairs.join('');
}

function palindromeDescendant (value) {
  const forward = value.toString();
  const reverse = reverseString(forward);

  // this is only here to demonstrate recursion in output
  console.log(forward);

  if (forward === reverse) return true;

  const descendant = sumPairs(value);

  return descendant.length >= 2 && palindromeDescendant(descendant);
}

console.log(palindromeDescendant(11211230));

【讨论】:

  • 非常感谢
  • 关于无限增长,问题要求每一对求和如下:11211230 ➞ 2333 ➞ 56 ➞ 11 所以调用函数时需要使用偶数位数
  • 我试图做的挑战只调用偶数位数的参数,并按照我指定的方式添加它们。我的程序正在这样做。我检查了他们所有的例子并得到了相同的结果
  • @JeffS 感谢您的澄清,我只是错过了您在for 循环正文中调用i++ 的位置,因此我更新了我的建议以提高其可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多