Javascript Array.prototype.map函数与实例方法

时间:2016-03-25 21:57:53

标签: javascript arrays

我想知道是否可以将实例方法传递给Array.prototype.map函数。

例如,我基本上想要这个功能,而不必单独创建一个函数



bindParam




在java中

我可以做$sql = "SELECT COUNT(*) FROM `Blog` WHERE `Title`!=''"; if($tags != ""){ $sql .= " AND Tags LIKE :tags"; } $r = $db->prepare($sql); $tags_like = "%$tags%"; $r->bindParam(':tags', $tags_like); 。我可以做些什么来改变map参数,这样我就不必创建函数吗?

如果你不能用香草js做的话,我也愿意接受lodash的解决方案。

2 个答案:

答案 0 :(得分:4)

我认为你不能在不创建新函数的情况下严格执行此操作,但是你可以避免binding现有函数的函数表达式和声明达到某种值。

例如,您可以使用Function.prototype.callNode.prototype.isBig值调用this

var result = myArray.map(Function.prototype.call.bind(Node.prototype.isBig));

还有一个bind operator的提案,我认为它会允许

var result = myArray.map(::Node.prototype.isBig.call);

注意其他参数(索引和数组)将传递给isBig方法。



function Node(n) {
  this.val = n;
}
Node.prototype.isBig = function() {
  return this.val > 5;
};
var myArray = [
  new Node(1), new Node(2), new Node(3),
  new Node(7), new Node(8), new Node(9)
];
var result = myArray.map(Function.prototype.call.bind(Node.prototype.isBig));
document.write(JSON.stringify(result));




在ES6中,您可以考虑使用arrow functions

var result = myArray.map(node => node.isBig());

答案 1 :(得分:1)

您必须创建一个以节点作为参数的函数(也就是说,它不依赖于this

Node.isBig = function(node) {
  return node.isBig();
};

//works because function doesn't depend on this
myArray.map(Node.isBig);
// doesn't work, depends on this
myArray.map(Node.prototype.isBig);

或者,您可以创建一个函数,该函数返回另一个带有第一个参数的函数,并将其称为this

 function passFirstArgAsThis (fun) {
     return function() {
         fun.apply(arguments[0], arguments);
     }
 }
 myArray.map( passFirstArgAsThis(Node.prototype.isBig));

稍微更加神秘的实现

function passFirstArgAsThis(fn) {
    return function() {
        return fn.call.apply(fn, arguments);  
    };
}

ES6中的等效内容更具可读性

function passFirstArgAsThis(fn) {
    return function() {
        // arguments[0] will be the first argument passed to call
        // map will pass it as the node, we will make it become `this`
        // when calling the passed in function
        return fn.call(...arguments); 
    };
}

了解这一点,Oriol's answer变得更容易理解

function passFirstArgAsThis(fn) {
    // we return a bound function that will execute the call method, bound
    // to the same passed in function 
    return fn.call.bind(fn);
    // Same as 
    // return function() {
    //    return fn.call(...arguments);
    // }
}

就个人而言,我会使用胖箭头函数来提高可读性,而不需要额外的“静态”函数。

nodes.map(n=>n.isBig())