对象内部的数组:从另一个对象的数组

时间:2015-09-03 09:23:59

标签: javascript arrays foreach filter

声明

我完全不知道如何简洁地描述我试图解决的问题的本质而不深入上下文。我甚至想到了一个合适的头衔。出于这个原因,我发现几乎不可能在这里和整个网络上找到答案,这对我有帮助。可能我的问题可以简化为一些已经有答案的简单问题。如果是这种情况,我为精心制作的副本道歉

TL; DR

我有两个数组:主数组members和目标数组neighbours(技术上很多目标数组,但这是tl; dr)。主数组是我的自定义组对象的属性,该对象使用自定义球对象自动填充。目标数组是我的自定义球对象的属性。我需要扫描members数组内的每个元素,并计算该元素与members组中每个其他元素之间的距离。如果在当前元素的设定距离内存在其他元素,则需要将这些其他元素复制到当前元素的目标数组中。这种检测需要实时进行。当两个元素变得足够接近邻居时,它们将被添加到它们各自的neighbours数组中。当它们变得太远以至于被认为是邻居时,它们需要从它们各自的neighbours阵列中移除。

CONTEXT

我的问题主要是关于数组迭代,比较和操作,但要理解我需要提供一些上下文的确切困境。我的上下文代码片段尽可能简短。我正在将Phaser库用于我的项目,但我的问题不依赖于Phaser。

我制作了自己的对象叫Ball。目标代码是:

Ball = function Ball(x, y, r, id) {
  this.position = new Vector(x, y); //pseudocode Phaser replacement
  this.size = r;
  this.id = id;
  this.PERCEPTION = 100;
  this.neighbours = []; //the destination array this question is about
}

我的所有Ball对象(到目前为止)都位于一个组中。我创建了一个BallGroup对象来放置它们。相关的BallGroup代码是:

BallGroup = function BallGroup(n) { //create n amount of Balls
  this.members = []; //the main array I need to iterate over

  /*fill the array with n amount of balls upon group creation*/
  for (i = 0; i < n; i++) {
    /*code for x, y, r, id generation not included for brevity*/
    this.members.push(new Ball(_x, _y, _r, _i)
  }

}

我可以使用以下内容创建一组4个Ball对象:

group = new BallGroup(4);

这很好用,我还没有包含Phaser代码,我可以点击/拖动/移动每个球。我还有一些Phaser.utils.debug.text(...)代码,它显示了易于阅读的4x4表格中每个球之间的距离(当然重复的距离为Ball0-&gt; Ball3与距离Ball3-> Ball0相同)。对于文本叠加,我使用嵌套的for循环计算距离:

for (a = 0; a < group.members.length; a++) {
    for (b = 0; b < group.members.length; b++) {
        distance = Math.floor(Math.sqrt(Math.pow(Math.abs(group.members[a].x - group.members[b].x), 2) + Math.pow(Math.abs(group.members[a].y - group.members[b].y), 2)));
        //Phaser text code
    }
}

现在是我问题的核心。每个球都有一系列检测PERCEPTION = 100。我需要迭代每个group.members元素并计算该元素(group.members[a])与group.members数组中的每个其他元素之间的距离(我可以做这个计算)。我遇到的问题是我无法复制那些与group.members[a]的距离为&lt; PERCEPTION的元素。 group.members[a].neighbours进入BallGroup.members数组。

我将主数组(Ball.neighbours)放在一个对象中而我的目标数组放在另一个对象(PERCEPTION中)的原因是因为我需要BallGroup中的每个Ball都知道它&# 39;自己的邻居没有关心BallGroup内其他球的邻居是什么。但是,我相信这两个数组(主要和目的地)在不同的对象中的事实是我遇到这么多困难的原因。

但有一个问题。这种检测需要实时进行,当两个球不再在neighbours范围内时,必须将它们从各自的group.members[0] -> no neighbours group.members[1] -> in range of [2] and [3] group.members[2] -> in range of [1] only group.members[3] -> in range of [1] only //I would then expect group.members[1].neighbours to be an array with two entries, //and both group.members[2].neighbours and group.members[3].neighbours to each //have the one entry. group.members[0].neighbours would be empty 阵列中移除。

示例

group.members[0] -> no neighbours
group.members[1] -> no neighbours
group.members[2] -> in range of [3] only
group.members[3] -> in range of [2] only

//I would then expect group.members[2].neighbours and group.members[3].neighbours 
//to be arrays with one entry. group.members[1] would change to have zero entries

我将group.members [2]和group.members [3]拖到了一个角落

for

我做了什么

我已经尝试了足够的东西来混淆任何人,这就是我来这里寻求帮助的原因。我首先尝试了复杂的嵌套if/else循环和Array.forEach语句。这导致邻居被无限添加,并开始变得太复杂,我无法跟踪。

我调查了Array.filterforEach。我无法弄清楚filter是否可以用于我需要的东西,我非常兴奋地了解Array.filter做什么(返回符合条件的元素数组)。当使用BallGroup = function BallGroup(n) { this.members = []; //the main array I need to iterate over //other BallGroup code here this.step = function step() { //this function will run once per frame for (a = 0; a < this.members.length; a++) { //members[a] to be current element for (b = 0; b < this.members.length; b++) { //members[b] to be all other elements if (a != b) { //make sure the same element isn't being compared against itself var distance = Math.sqrt(Math.pow(Math.abs(this.members[a].x - this.members[b].x), 2) + Math.pow(Math.abs(this.members[a].y - this.members[b].y), 2)); function getNeighbour(element, index, array) { if (distance < element.PERCEPTION) { return true; } } this.members[a].neighbours = this.members.filter(getNeighbour); } } } } } 时,它或者将Ball对象赋予零邻居,或者将所有其他Ball作为邻居包括在内而不管距离(我无法弄清楚它为什么会这样做,但它绝对不是我需要它做什么)。在撰写此问题时,我目前检测邻居的代码是:

{{1}}

我希望我的问题有道理并且解释得很好。我确切地知道自己需要在自己的项目环境中做些什么,但是把这些内容写成其他人以了解谁对我的项目一无所知是一个挑战。我到目前为止学习Javascript并且到目前为止做得很好,但是这种特殊情况让我彻底迷失了。我太深了,但我不想放弃 - 我想学习!

许多,很多,非常感谢那些花时间阅读我很长篇文章并尝试提供一些见解的人。

编辑:更改了&gt;到&lt;

1 个答案:

答案 0 :(得分:1)

我正在学习更多关于对象文字的知识,我试图学习JS以使自己摆脱我的jQuery依赖。我正在创建一个简单的库,我创建了一个函数,将一个对象的属性添加到另一个对象。它没有经过测试,但我认为如果你应用类似的东西,它可能有所帮助。我会尝试找到我的资源。顺便说一句,我现在手头上没有这些文章,但我记得使用新文章可能会产生复杂情况,对不起,我不能再这么做了,我会发布更多信息,因为我发现它。

  1. xObject可以是球组
  2. Obj2可能是会员
  3. Obj1可能是目的地
  4. &#13;
    &#13;
    /* augment(Obj1, Obj2) |  Adds properties of Obj2 to Obj1. */
    
    // xObject has augment() as a method called aug
    
    var xObject = {
      aug: augument
    }
    
    /* Immediately-Invoked Function Expression (IIFE) */
    
    (function() {
    
      var Obj1 = {},
    
        Obj2 = {
          bool: true,
          num: 3,
          str: "text"
        }
    
      xObject.aug(Obj1, Obj2);
    
    }()); // invoke immediately
    
    function augment(Obj1, Obj2) {
    
      var prop;
    
      for (prop in Obj2) {
    
        if (Obj2.hasOwnProperty(prop) && !Obj1[prop]) {
    
          Obj1[prop] = Obj2[prop];
        }
      }
    }
    &#13;
    &#13;
    &#13;