Javascript 是否使用筛选器()检查冲突?

Javascript 是否使用筛选器()检查冲突?,javascript,filter,collision-detection,Javascript,Filter,Collision Detection,通常我在JS中没有太多问题,但这次我真的需要一些帮助来理解这段代码。玛丽·罗斯·库克(Mary Rose Cook)在她的太空入侵者游戏中使用了这种逻辑来过滤身体阵列,以发现与其他身体的碰撞 var bodies = []; ... update: function () { // bodies is an array of all bodies in the game var bodies = this.bodies; var notCollidingWithAnything = functi

通常我在JS中没有太多问题,但这次我真的需要一些帮助来理解这段代码。玛丽·罗斯·库克(Mary Rose Cook)在她的太空入侵者游戏中使用了这种逻辑来过滤身体阵列,以发现与其他身体的碰撞

var bodies = [];
...
update: function () {
// bodies is an array of all bodies in the game
var bodies = this.bodies;
var notCollidingWithAnything = function (b1) {
    return bodies.filter(function(b2) { return colliding(b1, b2); }).length === 0;
};

this.bodies = this.bodies.filter(notCollidingWithAnything)

// ...insert function to draw the bodies that are in the new bodies array...

}
有人能解释一下这个.body.filter(不与任何东西冲突)是如何工作的,而不向参数函数传递任何参数吗?编译器如何知道将数组的每个元素与数组的每个其他元素进行检查?请指导我在编译器中到底发生了什么,以便我能理解这一点

有人能解释一下
this.body.filter(不与任何内容冲突)
在不向参数函数传递任何参数的情况下是如何工作的吗?编译器如何知道将数组的每个元素与数组的每个其他元素进行检查

编译器(好吧,JavaScript引擎)不知道如何调用
而不与元素发生冲突<代码>数组#过滤器
执行

不与任何内容冲突
是对函数的引用。(函数在JavaScript中是正确的对象,因此我们对它们的引用就像对其他对象的引用一样。)代码将该引用传递到
Array#filter
,然后
Array#filter
为数组中的每个元素调用该函数一次,传递元素值(和index,和array;它传递三个参数,尽管我们通常只使用第一个参数)。然后它使用回调的返回值来决定是否将元素包含在它构建的新数组中

下面是简化的用于
数组#过滤器的代码
,您可以看到发生了什么:

function arrayFilter(callback) {
    // Remember this is called with `this` referring to an array-like object

    // Create a new, empty array for the result
    var result = [];

    // Loop through the items
    for (var index = 0; index < this.length; ++index) {
        // Get the value for this entry
        var value = this[index];

        // Call the callback
        if (callback(value, index, this)) {
            // Got a truthy return value, include the value in the result
            result.push(value);
        }
    }

    // Return the new array
    return result;
}
函数数组过滤器(回调){
//记住调用this时使用'this'表示类似数组的对象
//为结果创建一个新的空数组
var结果=[];
//循环浏览项目
对于(var指数=0;指数
同样,这是简化的,不是完全正确的;有关完全正确的步骤,请参阅

下面是一个日志记录的示例,精确显示了谁在做什么:

函数数组过滤器(回调){
log(“启动arrayFilter”);
var结果=[];
对于(var指数=0;指数console.log(“结果数组:,赔率);
好吧,我刚刚经历了一个“灯泡时刻”,我想我终于明白了这一点。因此,首先调用bodies.filter,将NotCollisdingWithAnything()作为参数。这个函数在定义时已经引用了特定的数组索引(b1)。因此,当调用它时,它会再次运行过滤器,这次是对b2的引用。第一个主体将根据b2[0](即主体)进行检查,然后是b2[1],b2[2]以此类推,返回一个布尔值。因此,如果它为false,则该实体不会与任何其他实体发生碰撞。然后,它对b1执行相同的操作,直到完成。我明白了吗?@Azurasky:完美!这是通过调用函数作为碰撞(b1,b2)来相互检查
实体
数组的每个项(包括temselfs)
通常情况下,我希望项目在自己检查时碰撞并返回
true
,因此我希望得到的过滤数组与实体具有相同的长度,但天知道碰撞函数中发生了什么。它可能会告诉完全重叠的实体相同,并可能返回
false
(一个物体本身不能碰撞)对,碰撞函数确保首先考虑对象是否等于自身,然后考虑所有其他位置。这就是为什么测试长度是否等于0,而不是1。不过,我没有包括这一部分。我更感兴趣的是如何准确地筛选()作为一个函数工作。如果将另一个筛选器()放入混合中,则会增加一层复杂性,但一旦分解,我发现这并不难理解。我发明了一种通用数组方法,可以在两个数组的每个项中应用回调。
Array.prototype.Witheather()
它也可以做这项工作。请参阅第页的工作说明。