我试图创建这种简单的逻辑,而我希望将数组值添加到先前的值。例如下面的代码,18应携带1并加到9,而9将是10,然后携带1并加到7便是8,依此类推。我认为我走在正确的道路上,但我想不通。
这是我正在使用的附加数学生成器。
var foo = [7, 9, 18];
var bar = foo.map(i=>{
return i % 10
})
console.log(bar) // [7,9,8] I want it to be [8,0,8]
答案 0 :(得分:1)
您必须带一个进位图:
let carry = 0;
const result = [7, 9, 18].reverse().map(n => {
n += carry;
carry = Math.floor(n / 10);
return n % 10;
}).reverse();
要扩展进位溢出的结果,请添加:
if(carry)
result.unshift(...[...("" + carry)].map(Number));
答案 1 :(得分:0)
您需要从末尾迭代数组,并在开始和结束时对数组进行反向操作。
var array = [7, 9, 18],
result = array
.reverse()
.map(
(carry => value =>
[carry += value, carry % 10, carry = Math.floor(carry / 10)][1])
(0)
)
.reverse();
console.log(result);
要获取领先的进位价值,您可以使用另一种方法Array#reduceRight
并进行一些扩展。
var array = [107, 9, 18],
result = [];
result = [
...(array.reduceRight((c, v) => (result.unshift((c += v) % 10), c / 5 >> 1), 0) || '').toString() || [],
...result
].map(Number);
console.log(result);
答案 2 :(得分:0)
执行此操作的另一种方法是
const foo = [7, 9, 18];
const func = (arr) => {
let q = 0;
// Iterate from the end of the array with reduceRight
let toReturn = arr.reduceRight((acc, val) => {
// Add the previous q
val += q;
// Get the next q
q = Math.floor(val / 10);
return acc.concat(val % 10);
}, []).reverse();
// If there is a q add it to the array
if (q) toReturn = [q, ...toReturn];
return toReturn;
};
console.log(func(foo));
答案 3 :(得分:0)
另一种方法如下:
这可以通过使用适当的数组映射语法来实现。我已修改您的代码以获得预期的结果。请在下面找到代码:
var array1 = [7, 9, 18];
const customArr = array1.reverse().map((currentValue, index, arr) => {
if(index < arr.length)
arr[index+1] += Math.floor(currentValue / 10);
return currentValue % 10;
}).reverse();
console.log(customArr);
我认为,这就是您所期望的。
答案 4 :(得分:0)
这可能不是最有效的方法,为了使第一个数字正确显示两位数,我做了下面的事情。
const foo = [17, 9, 18];
const func = (arr) => {
let q = 0;
// Iterate from the end of the array with reduceRight
let toReturn = arr.reduceRight((acc, val) => {
// Add the previous q
val += q;
// Get the next q
q = Math.floor(val / 10);
return acc.concat(val % 10);
}, []).reverse();
// If there is a q add it to the array
if (q) toReturn = [q, ...toReturn];
if (q) {
let sum = Number(toReturn.slice(0, 2).join(""))
toReturn.shift();
toReturn[0] = sum;
return toReturn
}
return toReturn;
};
console.log(func(foo));