我将从我想要得到的结果的一个小描述开始:
让我们想象一下,我们有一个名为" 元素"其中包含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"直到最后都这样做。
谢谢,
答案 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 :(得分:0)
@ cynicaljoy的回答激发了我两种方式:
非常感谢。
现在,在进行了必要的修改之后,这是一个使用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++;
}
}
我仍然很想知道为什么问题中提出的解决方案没有按预期工作,并且在内存使用方面看到了优化的代码。
希望这有助于其他人。谢谢大家