使用"的嵌套循环遍历流星中的集合。 forEach"

时间:2015-12-28 21:38:50

标签: javascript meteor foreach

我将从我想要得到的结果的一个小描述开始:

让我们想象一下,我们有一个名为" 元素"其中包含4个文件:' a',' b'' c'并且' d'。 我想迭代" 元素"并插入名为" 查询"的新集合中对:

(A,B);(A,C);(一,d);(B,A);(B,C)...(d,A);(d,B);(d, C)。 =>这意味着" 查询"将包含(在此示例中)最后4 * 3 = 12对元素(文档)。

以下是我使用的代码(它是通过点击按钮触发的流星服务器中的方法):

'Queries': function() {
    var allElements = Elements.find();
    allElements.forEach(function(myLeftElement){ //First forEach
        allElements.forEach(function(myRightElement){// Nested forEach
            if(myLeftElement._id !== myRightElement._id){
                Queries.insert( {myLeftElement : myLeftElement._id, myRightElement : myRightElement._id} );
            }
        }); //End Of nested forEach
    }); //End Of First forEach
}

事实上它只适用于第一个" myLeftElement"与所有其他元素" myRightElement"但到此为止: 它插入"查询"集合,对:[(a,b);(a,c)和(a,d)]然后停止。

由于我是网络开发的初学者,特别是使用Meteor,我正在寻求你的帮助。

1)我需要理解为什么一旦嵌套游标方法" forEach"停止,整个功能停止。

2)我如何改进代码以获得我真正想要的结果:我的集合中的每个元素" myLeftElement"有一个forEach方法可以与所有其他元素" myRightElement"创建对。然后移动到下一个" myLeftElement"直到最后都这样做。

谢谢,

2 个答案:

答案 0 :(得分:0)

这是一个使用vanilla JavaScript迭代数组的工作示例,它获得了预期的结果:



var elements = ['a', 'b', 'c', 'd'];

var result = [];

elements.forEach(function(item) {
  // Create a copy of the current array to work with
  var elements_copy = elements.slice(0);
  var temp_array = [];

  /*
  Delete the current `item` from the array since
  we don't want duplicate 'a:a' items in the array.
  IMPORTANT: There are better ways of doing this,
  see: http://stackoverflow.com/questions/3954438/remove-item-from-array-by-value
  */
  elements_copy.splice(elements_copy.indexOf(item), 1);

  elements_copy.forEach(function(child_item) {
    temp_array.push(item + "," + child_item);
  });

  result.push(temp_array);
});

console.log(result);




您需要确保在开发人员工具中打开控制台才能查看结果。

当你开始时,我建议你以最不复杂的方式获得工作场景 - 比如我将Meteor和Mongo从图片中删除 - 以确保你的逻辑是正确的,然后从那里开始工作

所以,直接回答你的问题:

  1. 不确定为什么它因为我无法重新创建而停止
  2. 提供的示例应该足够了 - 但我确信有更好的方法
  3. 希望有所帮助!

答案 1 :(得分:0)

@ cynicaljoy的回答激发了我两种方式:

  • 使用数组
  • 更好的方法是删除重复的' a:a'数组中的项目(通过访问他提供的链接)。

非常感谢。

现在,在进行了必要的修改之后,这是一个使用Meteor和Mongodb代码实际工作正常的解决方案:

'Queries' : function() {

var allElements = Elements.find().map(function(item){return item._id} ); /* this returns an array of item._id of all elements*/
var totalItems = allElements.length;
var itemsCounter = 0;
var withoutLeftItem;
   while(itemsCounter < totalItems){
      withoutLeftItem=_.without(allElements,allElements[itemsCounter] ); /*The function _.without(array, *items) used in underscore.js returns array with specified items removed */    
      withoutLeftItem.forEach(function(myRightElement){
         Queries.insert( {myLeftElement : allElements[itemsCounter], myRightElement : myRightElement} );
      });
   itemsCounter++;
   }
 }

我仍然很想知道为什么问题中提出的解决方案没有按预期工作,并且在内存使用方面看到了优化的代码。

希望这有助于其他人。谢谢大家