我想在映射数组时复合值,我试过这个但是它不起作用:
var array = children.map((child, i) => {
return child.offsetHeight + array[i-1]
})
我想要一个看起来像这样的数组:
[1, 5, 3, 2]
输出:
[1, 6, 9, 11]
不要求使用地图。但我不介意使用比for-loop更有意义的东西。
答案 0 :(得分:3)
您可以结合使用Array#map
,Array#slice
和Array#reduce
:
.map( ... )
通过您的数组
.slice( ... )
从您的数组中删除一部分,从开头到i+1
.reduce( ... )
返回先前剪切的数组
let children = [1, 5, 3, 2];
var array = children.map((child, i) =>
children.slice(0,i+1).reduce((acc, curr) => acc + curr, 0));
console.log(array);

答案 1 :(得分:3)
这是使用forEach
循环的其他提案和简单单行的替代方法:
let a = [1, 5, 3, 2],
b = [];
a.forEach((el, it) => { b.push(el + (b[it - 1] || 0)) });
console.log(b)

(b[it - 1] || 0)
涵盖我们访问b[-1]
答案 2 :(得分:2)
这是一种方式:
phone

当你可以访问当前状态而不仅仅是当前项或输入数组时,Reduce比map更好。
答案 3 :(得分:1)
你可以做这样的事情,你必须在位置0
检查该数组不存在。此解决方案避免了每个步骤使用reduce
和slice
,从而提高了性能;
var children = [1, 5, 3, 2]
var sum = 0;
var array = children.map((child, i, array) => {
sum = sum + child;
return sum;
})
console.log(array)
答案 4 :(得分:1)
您可以使用array#reduce
。
var result = [1, 5, 3, 2].reduce((r,v,i) => {
i ? r.push(r[i-1] + v) : r.push(v);
return r;
},[]);
console.log(result);

答案 5 :(得分:1)
最简单的解决方案是map slice和reduce的组合:
arr = [1,5,3,2]
result = arr.map((elem, index) => arr.slice(0, index + 1).reduce((a,c) => a+c))
console.log(result)
答案 6 :(得分:0)
您可以使用reduce()
方法而不是map()
执行此操作。因此,如果当前索引不为0,则可以从累加器中获取最后一个元素并添加当前元素。
const data = [1, 5, 3, 2]
const result = data.reduce((r, e, i) => {
r.push(i ? +r.slice(-1) + e : e)
return r;
}, []);
console.log(result)
您也可以使用map()
方法使用thisArg
参数执行此操作并将最后一个值存储在其中。
const data = [1, 5, 3, 2]
const result = data.map(function(e) {
return this.n += e
}, {n: 0});
console.log(result)
或者您可以使用IIFE和内部使用map()
方法创建闭包。
const data = [1, 5, 3, 2]
const result = (s => data.map(e => s += e))(0)
console.log(result)
答案 7 :(得分:0)
使用for...of
的示例:
var arr = [1, 5, 3, 2]
var res = []
var c = 0
for (let item of arr) {
c += item
res.push(c)
}
console.log(res)
//[1, 6, 9, 11]