Javascript 将数组中的数字按两位数字序列求和
Javascript sum numbers in an array by two digit sequence each
我坚持这个练习,最后我告诉你我的输出是什么,但在练习描述之前,先谢谢了!
描述:
它接收一个包含数字和字母的数组,并且 returns 它的数字经过美化。字母保持不变
美化过程是通过将一个数字的所有数字相加,将一个数字缩减为一个数字:
123 = 6 because 1+2+3 = 6
9 = 9
9956 = 2 because 9+9+5+6 = 29 -> 2+9 = 11 -> 1+1 = 2
793 = 1 because 7+9+3 = 19 -> 1+9 = 10 -> 1+0 = 1
Example: beautifyNumbers([23,59, 4,'A','b']) returns [5, 5, 4, 'A', 'b']
我的代码:
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
var sNumber = element.toString();
for (var i = 0, len = sNumber.length; i < len; i += 1) {
newArray.push(+sNumber.charAt(i));
// The "+" sign converts a String variable to a Number, if possible: +'21.2' equals Number(21.2).
// If the conversion fails, it return NaN.
// El método charAt() de String devuelve el carácter especificado de una cadena:
// var name="Brave new world"; name.charAt(0) => 'B'
}
console.log(newArray);;
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
// returns the array
return newArray;
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
我收到的输出是 => [2, 3, 5, 9, 4, "A", "b"]
这是求和之前的 "previous" 步还是我做错了什么?
您可以使用 recursion
+ array.reduce
递归
function sumOfDigits(num) {
// Check if value is number or alphanumeric
if (!isNaN(num)) {
// Convert number and split to get individual values.
// Loop over values and add them
var sum = num.toString().split("").reduce(function(p, c) {
// +p is a shorthand for parseInt(p)
return +p + +c;
});
// check if number is greater than 10. If yes, repeat the process
if (sum >= 10) sum = sumOfDigits(sum);
return sum;
}
// if value is not number, return value
else return num;
}
var data = [123, 4, 567, 'a', "abc", 0];
data.forEach(function(n) {
console.log(sumOfDigits(n))
})
在您的示例中,您应该将部分更改为:
来自:
for (var i = 0, len = sNumber.length; i < len; i += 1) {
newArray.push(+sNumber.charAt(i));
}
console.log(newArray);;
至:
var mySum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
mySum += sNumber.charAt(i);
}
newArray.push(mySum);
console.log(newArray);
这样试试:
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
newArray.push(beautifyElement(element));
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
// returns the array
return newArray;
}
function beautifyElement(element){
var sNumber = element.toString();
var sum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
sum = sum + +sNumber[i];
}
if(sum>9){
return beautifyElement(sum);
}else{
return sum;
}
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
我已经修改了你的代码。请找到下面的代码,它会根据您的需要给出结果。
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function (element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
var sNumber = element.toString();
var beutifySum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
beutifySum += +sNumber.charAt(i);
}
beutifySum = beutifySum % 9 === 0 ? 9 : beutifySum % 9;
newArray.push(beutifySum);
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
console.log(newArray);
// returns the array
return newArray;
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
您好,您可以像我在评论中提到的那样尝试。
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
if(element %9 == 0 && element != 0)
newArray.push(9);
else
newArray.push(element%9);
} else {
newArray.push(element);
}
});
return newArray;
}
console.log(beautifyNumbers([1231, 0, 18, 27, 12354, 59, 4, 'A', 'b']))
编辑:
感谢@georg 的建议。
function bsum(v) {
var res = (v+"").split('').reduce(function(a, b) {return (a | 0) + (b | 0);});
if(res | 0 > 10) return bsum(res) ;
else return res;
}
function beautifyNumbers(array) {
return array.map(function(v, i) {
if (typeof v == 'number') {
return bsum(v) | 0;
}
else return v;
});
}
没有任何字符串操作的纯函数这将是我的解决方案;
function funnySum(n){
var d = Math.floor(Math.log10(n) +1), // get number of digits
sum = Array(d).fill() // prepare the array and place digits
.map((_,i) => Math.floor(n % Math.pow(10,d-i) / Math.pow(10,d-1-i)))
.reduce((p,c) => p+c); // get sum of array items
return sum > 9 ? funnySum(sum) : sum; // if still two digits continue...
}
console.log(funnySum(9956));
我坚持这个练习,最后我告诉你我的输出是什么,但在练习描述之前,先谢谢了!
描述:
它接收一个包含数字和字母的数组,并且 returns 它的数字经过美化。字母保持不变 美化过程是通过将一个数字的所有数字相加,将一个数字缩减为一个数字:
123 = 6 because 1+2+3 = 6
9 = 9
9956 = 2 because 9+9+5+6 = 29 -> 2+9 = 11 -> 1+1 = 2
793 = 1 because 7+9+3 = 19 -> 1+9 = 10 -> 1+0 = 1
Example: beautifyNumbers([23,59, 4,'A','b']) returns [5, 5, 4, 'A', 'b']
我的代码:
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
var sNumber = element.toString();
for (var i = 0, len = sNumber.length; i < len; i += 1) {
newArray.push(+sNumber.charAt(i));
// The "+" sign converts a String variable to a Number, if possible: +'21.2' equals Number(21.2).
// If the conversion fails, it return NaN.
// El método charAt() de String devuelve el carácter especificado de una cadena:
// var name="Brave new world"; name.charAt(0) => 'B'
}
console.log(newArray);;
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
// returns the array
return newArray;
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
我收到的输出是 => [2, 3, 5, 9, 4, "A", "b"]
这是求和之前的 "previous" 步还是我做错了什么?
您可以使用 recursion
+ array.reduce
递归
function sumOfDigits(num) {
// Check if value is number or alphanumeric
if (!isNaN(num)) {
// Convert number and split to get individual values.
// Loop over values and add them
var sum = num.toString().split("").reduce(function(p, c) {
// +p is a shorthand for parseInt(p)
return +p + +c;
});
// check if number is greater than 10. If yes, repeat the process
if (sum >= 10) sum = sumOfDigits(sum);
return sum;
}
// if value is not number, return value
else return num;
}
var data = [123, 4, 567, 'a', "abc", 0];
data.forEach(function(n) {
console.log(sumOfDigits(n))
})
在您的示例中,您应该将部分更改为:
来自:
for (var i = 0, len = sNumber.length; i < len; i += 1) {
newArray.push(+sNumber.charAt(i));
}
console.log(newArray);;
至:
var mySum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
mySum += sNumber.charAt(i);
}
newArray.push(mySum);
console.log(newArray);
这样试试:
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
newArray.push(beautifyElement(element));
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
// returns the array
return newArray;
}
function beautifyElement(element){
var sNumber = element.toString();
var sum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
sum = sum + +sNumber[i];
}
if(sum>9){
return beautifyElement(sum);
}else{
return sum;
}
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
我已经修改了你的代码。请找到下面的代码,它会根据您的需要给出结果。
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function (element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
var sNumber = element.toString();
var beutifySum = 0;
for (var i = 0, len = sNumber.length; i < len; i += 1) {
beutifySum += +sNumber.charAt(i);
}
beutifySum = beutifySum % 9 === 0 ? 9 : beutifySum % 9;
newArray.push(beutifySum);
} else {
// pushes numbers to the array without making
// any change to them
newArray.push(element);
}
});
console.log(newArray);
// returns the array
return newArray;
}
beautifyNumbers([23, 59, 4, 'A', 'b'])
您好,您可以像我在评论中提到的那样尝试。
function beautifyNumbers(array) {
var newArray = [];
array.forEach(function(element) {
// Checks if character is a letter and not a number
if (typeof element == "number") {
if(element %9 == 0 && element != 0)
newArray.push(9);
else
newArray.push(element%9);
} else {
newArray.push(element);
}
});
return newArray;
}
console.log(beautifyNumbers([1231, 0, 18, 27, 12354, 59, 4, 'A', 'b']))
编辑: 感谢@georg 的建议。
function bsum(v) {
var res = (v+"").split('').reduce(function(a, b) {return (a | 0) + (b | 0);});
if(res | 0 > 10) return bsum(res) ;
else return res;
}
function beautifyNumbers(array) {
return array.map(function(v, i) {
if (typeof v == 'number') {
return bsum(v) | 0;
}
else return v;
});
}
没有任何字符串操作的纯函数这将是我的解决方案;
function funnySum(n){
var d = Math.floor(Math.log10(n) +1), // get number of digits
sum = Array(d).fill() // prepare the array and place digits
.map((_,i) => Math.floor(n % Math.pow(10,d-i) / Math.pow(10,d-1-i)))
.reduce((p,c) => p+c); // get sum of array items
return sum > 9 ? funnySum(sum) : sum; // if still two digits continue...
}
console.log(funnySum(9956));