javascript - 检查此 Javascript 代码是否为 'DRY' 或效率低下

标签 javascript palindrome

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

来自 edabit.com 的方向:

A number may not be a palindrome, but it's descendant can be. A number's direct child is created by summing each pair of adjacent digits to create the digits of the next number. Create a function that returns true if the number itself is a palindrome or any of its descendants down to 2 digits

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;
}

最佳答案

您的结果是隐式全局的,这是不好的做法。当在严格模式下运行时,您的脚本会抛出错误

Uncaught ReferenceError: result is not defined

有很多地方使用 (""+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));

关于javascript - 检查此 Javascript 代码是否为 'DRY' 或效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57436499/

相关文章:

javascript - React-toastr 3 与 typescript

javascript - 这是写这个的正确格式吗?它不工作

JavaScript 文本转换

algorithm - 使用 K 个字母查找大小为 N 的回文的总数

Python:遍历列表列表中的列以查找回文

java - 为什么我的程序在前 10 个回文数之后不再继续?还有为什么我的 isPrime 方法没有为数字 4 返回 false ?

c# - 两个 3 位数的回文数乘积 - Project Euler Solution 4 - 蛮力不起作用

javascript - 如何从用户控件调用 JavaScript 函数

javascript - 我正在尝试按 json 内的 json 键对变量进行排序

javascript - JS回文校验 "every"辅助方法分解