二维数组javascript的forEach()和Apply()方法

时间:2016-01-12 15:27:41

标签: javascript arrays multidimensional-array foreach

我有一个数组,哪些元素也是数组,每个数组包含3个元素。我想使用function calcMe(a,b,c){...}方法为主数组的每个元素调用forEach()但我真的很困惑,不知道如何让它工作。

arr = [[1,5,4],[8,5,4],[3,4,5],[1,2,3]]
function calcMe(a,b,c){...}
arr.forEach(calcMe.Apply(-----,-----));

如何使用Apply()将每个内部数组的元素作为参数传递给我的函数?

5 个答案:

答案 0 :(得分:5)

apply会立即调用函数,因此您无法直接使用它,因为forEach需要函数引用。但是,您可以在bind上使用apply来实现您的目标:

arr.forEach(Function.apply.bind(calcMe, void 0));

第二个参数将是this值。您可以提供任何值而不是void 0

var arr = [[1,5,4],[8,5,4],[3,4,5],[1,2,3]];
function calcMe(a,b,c){
  document.querySelector('pre').textContent += [a,b,c] + '\n';
}
arr.forEach(Function.apply.bind(calcMe, void 0));
<pre></pre>

答案 1 :(得分:3)

首先,calcMe似乎没有返回函数,因此您无法将其返回值传递给forEach

我猜你想要像

这样的东西

var arr = [
  [1, 5, 4],
  [8, 5, 4],
  [3, 4, 5],
  [1, 2, 3]
]

function calcMe(a, b, c) {
  var pre = document.getElementById('pre')
  pre.innerHTML += 'calcMe arguments: ' +  a +","+ b +","+ c  + "<br/>";
}

arr.forEach(function(el, index) {
  // Could also use `arr[index]` instead of el
  calcMe.apply(this, el);
});
<pre id='pre'></pre>

对于一个更高级的版本,you can bind Function.prototype.apply来模拟创建一个像我上面所做的功能。

答案 2 :(得分:2)

您需要为.forEach提供一项功能。该函数将在主数组的每个元素上运行。

根据calcMe的作用,您可能需要在calcMe.apply中为其提供正确的上下文。 .apply的第一个批处理是函数中的上下文(this关键字)。我只是放了null,但你可以传递适合你的东西。

var arr = [[1,5,4], [8,5,4], [3,4,5], [1,2,3]];
function calcMe(a,b,c){
    console.log(a, b, c);
}
arr.forEach(function (params) {
    calcMe.apply(null, params);
})

如果您愿意使用ES6,可以使用arrow functionsspread operator

arr.forEach(params => calcMe(...params));

答案 3 :(得分:1)

您可以提供lambda函数

bundle update

如果您不需要访问对象上下文,则将arr.forEach((u)=>{console.log(calcMe.apply(null, u))}); 绑定到第一个参数应该没问题。否则,绑定您想要的对象。

答案 4 :(得分:1)

如果您对ES6感兴趣,这是最快,最优雅的解决方案。

'use strict';
let arr = [
  [1, 5, 4],
  [8, 5, 4],
  [3, 4, 5],
  [1, 2, 3]
];

function calcMe(a, b, c) {
  document.querySelector('p').innerHTML += `${a},${b},${c}<br>`;
}
for (let item of arr) {
  calcMe(...item);
}
//or
arr.forEach(item => calcMe(...item));
<p></p>