我正在使用math.js,我想在数组addFive
的每个元素上调用方法x
。如果我在类似addFive
的变量上调用y
,它可以正常工作。我得到的输出为10。
x = math.matrix([2,3,4]);
let y= 5;
function example(){
this.a=5;
this.addFive = function(x){
return (x+this.a);
}
}
ex = new example();
let w = ex.addFive(y);
console.log(w);
当我尝试这个
let w = math.map(x, addFive);
console.log(w);
我收到一个错误addFive is not defined
。有没有不使用循环的方法吗?
答案 0 :(得分:2)
由于ex.addFive
仅在您的addFive
对象中定义,因此您必须以ex
的形式传递函数。
此外,您必须将函数绑定到ex
,以传递正确的上下文,以使this.a
在方法内部起作用。
请注意,您也可以使用matrix.map(fn)
代替math.map(matrix, fn)
。与内联定义的箭头功能结合使用,可以简化为:
console.log(math.matrix([2, 3, 4]).map(x => x + 5));
这里是一个示例:
function example() {
this.a = 5;
this.addFive = function (x) {
return x + this.a;
}
}
const ex = new example();
console.log(ex.addFive(5));
console.log(math.matrix([2, 3, 4]).map(ex.addFive.bind(ex)).toString());
console.log(math.map(math.matrix([2, 3, 4]), ex.addFive.bind(ex)).toString());
console.log(math.matrix([2, 3, 4]).map(x => x + 5).toString());
<script language="JavaScript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.8.0/math.min.js"></script>
答案 1 :(得分:2)
由于addFive
是实例上的方法,因此您需要通过实例来调用它。您可以通过调用ex.addFive()
来代替未定义为独立函数的裸addFIve()
来实现此目的。
x = math.matrix([2,3,4]);
function example(){
this.a=5;
this.addFive = function(x){
return (x+this.a);
}
}
ex = new example();
let w = math.map(x, (n) => ex.addFive(n));
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
当然,如果您只是使该对象使用addFive()
方法,则最好将其定义为一个函数,这将使一切变得更简单:
x = math.matrix([2,3,4]);
const addFive = (x) => x + 5
let w = math.map(x, addFive);
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
答案 2 :(得分:1)
假设math.map
将数组(或矩阵)作为第一个参数,并将一个针对每个参数的函数作为第二个参数,那么您需要传递一个 function 。现在addFive
是在example
对象的实例上定义的方法。因此,您首先需要创建一个对象才能访问该代码
let ex = new example();
接下来,您需要传递一个调用ex.addFive
的代码
let w = math.map(x, item => ex.addFive(item));
x = math.matrix([2,3,4]);
function example(){
this.a=5;
this.addFive = function(x){
return (x+this.a);
}
}
ex = new example();
let w = math.map(x, item => ex.addFive(item));
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
这样,您可以针对此矩阵中的每个项目运行ex.addFive
请注意,您也可以直接将引用传递给addFive
,但会遇到错误
math.map(x, ex.addFive)
x = math.matrix([2,3,4]);
function example(){
this.a=5;
this.addFive = function(x){
return (x+this.a);
}
}
ex = new example();
let w = math.map(x, ex.addFive);
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
这是因为当this
执行回调并且.map
使用addFive
时,this.a
上下文将丢失。您可以保留上下文by using .bind()
math.map(x, ex.addFive.bind(ex))
x = math.matrix([2,3,4]);
function example(){
this.a=5;
this.addFive = function(x){
return (x+this.a);
}
}
ex = new example();
let w = math.map(x, ex.addFive.bind(ex));
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
这是传递像上一个item => ex.addFive(item)
一样的回调的替代方法-两者是等效的,选择哪个无关紧要。我个人不喜欢在这种情况下使用.bind
,因为您已经有了 ex .bind,而只能跟随.bind( ex )。看起来有点荒谬。
另一种替代方法是更改功能-如果将this
更改为{p1,如果使用example
,则只需建立函数的上下文
function example(){
this.addFive = function(x){
return (x+5);
}
}
然后没有this
的用法,这意味着您可以调用math.map(x, ex.addFive)
并获得正确的结果。
x = math.matrix([2,3,4]);
function example(){
this.addFive = function(x){
return (x+5);
}
}
ex = new example();
let w = math.map(x, ex.addFive);
console.log(w);
<script src=https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.3.0/math.min.js></script>
答案 3 :(得分:-3)
addFive是一项功能,其中需要一个输入。尝试使用
let w = math.map(x, addFive(5));
console.log(w);