如何在数组上调用对象方法?

时间:2019-04-02 14:36:59

标签: javascript arrays

我正在使用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。有没有不使用循环的方法吗?

4 个答案:

答案 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);