我认为标题需要一些解释。我不想让我的程序将数字分成更小的位。
例如,它会将756分为700,50和6. 9123将分别为9000,100,20和3.我有什么方法可以为任何合理大小的数字执行此操作?
答案 0 :(得分:6)
这是一个可以做到的功能:
function breakNumbers(num){
var nums = num.toString().split('');
var len = nums.length;
var answer = nums.map(function(n, i) {
return n + (Array(len - i - 1).fill(0)).join('');
});
return answer.map(Number).filter(function(n) {return n !== 0;});
}
答案 1 :(得分:2)
function breakup(number) {
var digits = String(number).split('')
return digits.map(function(digit, i) {
return Number(digit.concat("0".repeat(digits.length - i - 1)))
}).filter(function(n) { return n !== 0 })
}
首先,我们要将数字转换为字符串,因此我们将其传递到String
原语,如下所示:String(number)
因此,在数组上调用split
方法并传入一个空字符串(告诉它为每个字符分割)会产生一个数字数组,即["7", "5", "6"]
我们现在可以将它们保留为字符串,因为它使下一部分更容易一些。使用map
函数,您可以传递一个应该在数组中的每个元素上调用的函数。除了这个函数的第一个参数,还有一个可选的第二个参数,它是数组中项的索引。在我们的情况下,这将变得有用,因为数组中的数字表示它是什么位置。
检查出来,传递给map的函数返回的值将当前数字字符串和concat
另一个字符串放在其上,这是一些重复的"0"
s。该数字是通过查看父数组的长度并从循环的当前项目的索引减1来确定的。这是因为在JavaScript中对数组进行了0索引 - 如果我们在第一次迭代中从digits.length
(索引)中减去i
,则值为3
和{{1}分别如果你传入0
,你的第一个值最终会得7000
。还要注意,在map函数内部的return语句中,我们将它包装回756
原语中,然后从字符串中将其强制转换回来。
另外,你没有提到这一点,但我认为你不希望你的例子中的数字等于0。通过在返回之前调用最终数组上的Number
,我们可以有效地确保只返回不等于filter
的项。因此,如果您致电0
,我们会收到breakup(756)
,但[700, 50, 6]
会给您breakup(706)
。
答案 2 :(得分:1)
我没有使用split()来分解数字,而是使用正则表达式来标记数字字符串。通过这种方式,我们可以通过将数字后跟小数点和任何其他数字视为单个标记来轻松处理任何尾随小数。这也可以将数字作为较大字符串的一部分来处理。
function splitNumber( number ) {
var parts = [];
var re = /(\d(?:\.\d*)?)/g;
while(next_part = re.exec(number)) {
// adjust place value
parts.forEach( function(element, index) {
parts[index] = 10 * element;
} );
parts.push( next_part[0] );
}
return parts.map(Number).filter(function(n) {return n !== 0});
}