使用 .includes 来查找数字中的数字是否与不同数字中的相同数字(例如 21 和 12)

using .includes to find if a the digits in a number are the same digits in a different number (e.g. 21 and 12)

我正在尝试解决一个问题,我必须检查两个不同的数字是否包含相同的数字,例如 12 和 21、34 和 43 等等。我发现这个方法可行,但它非常复杂且不实用。有更好的主意吗?

let num = 3332
let num2 = 3323

let arr = Array.from(num.toString()).map(Number);
let arr2 = Array.from(num2.toString()).map(Number);
if (arr2.includes(arr[0],arr[1],arr[2], arr[3])) {
  console.log("it works")
}

谢谢!!!

您当前的测试不准确,因为它不检查 num2 是否也包含 other 个数字 - 例如,9993332 会匹配还有。

一种可能是对数字进行排序,然后检查索引中的每个数字是否都等于另一个数组中的每个数字:

const toArr = num => [...String(num)].sort();
const check = (num1, num2) => {
  const arr1 = toArr(num1);
  const arr2 = toArr(num2);
  return arr1.length === arr2.length && arr1.every(
    (digit, i) => arr2[i] === digit
  );
};
console.log(check(3332, 3323));
console.log(check(3332, 9993323));

(一旦我们得到 Array.prototype.equals,上面就简化为 => toArr(num1).equals(toArr(num2)

一种计算成本较低(但一目了然更难阅读)的方法是将每个数字转换为一个计算频率的对象,然后比较这些对象。

const toObj = num => {
  const obj = {};
  for (const char of String(num)) {
    obj[char] = (obj[char] || 0) + 1;
  }
  return obj;
};
const check = (num1, num2) => {
  const entries1 = Object.entries(toObj(num1));
  const obj2 = toObj(num2);
  return (
    entries1.length === Object.keys(obj2).length &&
    entries1.every(([key, val]) => obj2[key] === val)
  );
};
console.log(check(3332, 3323));
console.log(check(3332, 9993323));

您可以对数字进行排序得到一个字符串并与另一个字符串进行比较。

function check(a, b) {
    return Array.from(a.toString()).sort().join('') === Array.from(b.toString()).sort().join('');
}

console.log(check(3332, 3323));
console.log(check(117, 771));
console.log(check(113, 771));