在排序数组时访问原型函数?

时间:2016-04-24 21:52:26

标签: javascript arrays prototype

我在使用数组中的原型函数进行排序时,围绕范围问题缠绕我的大脑时遇到了问题。我可以使它在静态项目上工作,但是当我尝试推广处理数组时,我开始看到“不是函数”错误。这是我目前对代码的再现。任何帮助将不胜感激。

function Automobile(year, make, model, type) {
    this.year = year; //integer (ex. 2001, 1995)
    this.make = make; //string (ex. Honda, Ford)
    this.model = model; //string (ex. Accord, Focus)
    this.type = type; //string (ex. Pickup, SUV)

}
Automobile.prototype.logMe = function(bool) {

    console.log("Working"); //testing function
    if (bool == true) {
        console.log(this);
    }

};

/*Sample Array*/
var automobiles = [
    new Automobile(1995, "Honda", "Accord", "Sedan"),
    new Automobile(1990, "Ford", "F-150", "Pickup"),
    new Automobile(2000, "GMC", "Tahoe", "SUV"),
    new Automobile(2010, "Toyota", "Tacoma", "Pickup"),
    new Automobile(2005, "Lotus", "Elise", "Roadster"),
    new Automobile(2008, "Subaru", "Outback", "Wagon")
];

/*This function sorts arrays using an arbitrary comparator.*/
function sortArr(comparator, array) {


    array.sort(function(a, b) {
        return comparator(a, b);
    });
    return array;
}

function exComparator(int1, int2) {
    if (int1 > int2) {
        return true;
    } else {
        return false;
    }
}


function yearComparator(auto1, auto2) {
    return exComparator(auto1.year, auto2.year);
}

/* Output*/
console.log("*****");
console.log("The cars sorted by year are:");
forEach(sortArr(yearComparator, automobiles), automobiles.logMe(true)); //This is not right!


function forEach(array, doStuff) {
    for (var i = 0; i < array.length; i++)
        doStuff(array[i]);
}

2 个答案:

答案 0 :(得分:1)

您报告的问题与排序没有任何关系(尽管排序比较器功能也无效 - 见下文)。

您获得的错误是因为您将forEach结果传递给logMe函数而不是对该函数的引用。无论如何,automobiles.sort(yearComparator).forEach(function(auto) { auto.logMe(true); }); 函数是共享的实例方法,并且不能通过数组。

您的排序功能也是不必要的 - 您可以编写整个排序/显示循环:

sortArr

然后删除不重复的标准ES5功能的forEachfalse / true函数。

要修复比较器,需要返回(-ve,0,+ ve)中的一个,而不是function yearComparator(auto1, auto2) { return auto1.year - auto2.year; } 。对于数字比较,只需返回两个数字之间的差异就足够了:

names = new String[100];
messages = new String[100];

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

答案 1 :(得分:0)

主要问题是&#34; automobiles.logMe(true)&#34;。汽车是汽车对象的阵列。阵列汽车中的每个元素都可以访问其原型函数logMe(),但不能访问数组本身。

此外,doStuff(array [i])反映出您应该了解有关三个重要函数(call,apply,bind)的更多信息。稍微查看一下本文将有助于:http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/