映射数组时复合值?

时间:2018-03-27 11:29:26

标签: javascript

我想在映射数组时复合值,我试过这个但是它不起作用:

var array = children.map((child, i) => {
    return child.offsetHeight + array[i-1]
})

我想要一个看起来像这样的数组:

[1, 5, 3, 2]

输出:

[1, 6, 9, 11]

不要求使用地图。但我不介意使用比for-loop更有意义的东西。

8 个答案:

答案 0 :(得分:3)

您可以结合使用Array#mapArray#sliceArray#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检查该数组不存在。此解决方案避免了每个步骤使用reduceslice,从而提高了性能;

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]