我有一个数组,哪些元素也是数组,每个数组包含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()
将每个内部数组的元素作为参数传递给我的函数?
答案 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 functions和spread 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>