使用 .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));
我正在尝试解决一个问题,我必须检查两个不同的数字是否包含相同的数字,例如 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));