2

我正在编写一个自定义排序函数,并将其原型化为 Array。(请不要发布答案,向我解释我不应该为 Array 进行原型设计,无论出于何种原因,您认为 Array 的原型设计不是一个好主意)。

所以,我的方法是这样的:

//method
Array.prototype.mySort = function(memberName, ascOrDesc){
    var labelRow = this.shift();   
    var ret = this.sort((function (a,b){
        if(ascOrDesc > 0)
            return (a[memberName] > b[memberName])?1:-1; 
        return (a[memberName] < b[memberName])?1:-1;    
    }));    
    ret.unshift(labelRow)
    return ret;
}

注意 this.shift() 将如何影响 Array IN PLACE。

但是,我不清楚这是如何实现的。如果我想编写自己的myShift方法,在某些时候我需要说一些大意的东西

this = this.myShift();

这显然是非法的。

因此,我试图了解 shift() 如何访问数组的成员并能够就地删除第一个成员。如果我被允许做类似的事情,或者如果这以某种方式被烘烤并且我无法使用。

4

2 回答 2

2

您可以使用方法内部访问数组this

例如,您可以将 shift 方法实现为:

Array.prototype.myShift = function() {
  if (this.length == 0) return null;
  var result = this[0];
  for (var i = 1; i < this.length; i++) {
    this[i-1] = this[i];
  }
  this.length--;
  return result;
};
于 2013-06-20T21:41:36.167 回答
1

问题是您不能分配给this. 这意味着你不能做这样的事情:

Array.prototype.myShift = function() {
    this = this.slice(1);
}; 

这是因为Array.prototype.slice返回一个新数组并且不修改旧数组。但是,其他方法(例如Array.prototype.splice确实会修改旧数组。所以你可以做这样的事情:

Array.prototype.myShift = function() {
    return this.splice(0, 1)[0];
};

Array.prototype.shift这将具有与标准方法完全相同的行为。它会修改当前数组,因此您可以这样做:

var labelRow = this.myShift();  
于 2013-06-20T21:43:24.253 回答