我有一个将值推送到数组中的函数(下面是非常简化的示例):
numOfArr = 3; //is dynamically retrieved. can be 1-500);
arr1 = [212,214,215,218]
arr2 = [212,259,214,292,218]
arr3 = [272,214,218,292]
我在每个“arr”数组上运行for循环,将它们的值推入“myArr”(工作正常)并使用它来获取“arr1”和“arr2”到“arr500”中的值“等我试图做的是迭代myArr,创建一个数组的临时副本,并使用.indexOf检查其他值,然后删除它们,但我知道我在某个地方犯了一个我不能做错的错误找到..
for(var i = 0; i < myArr.length; i++){
tempArr = myArr;
for(var j = 0; j < numOfArr; j++){
var spl = tempArr.indexOf(myArr[i]);
if(spl == -1 && myArr.indexOf(myArr[i]) !== -1){
myArr.splice(i,1);
} else {
tempArr.splice(i,1);
}
}
}
理想情况下,我想要的是“myArr”只能得到所有3个arr数组(214和218)中的值。我在myArr上删除splice的问题是因为循环仍在进行所有操作吗?
更新:
使用此处的示例:Simplest code for array intersection in javascript
function intersect_safe(a, b)
{
var ai=0, bi=0;
var result = new Array();
while( ai < a.length && bi < b.length )
{
if (a[ai] < b[bi] ){ ai++; }
else if (a[ai] > b[bi] ){ bi++; }
else /* they're equal */
{
result.push(a[ai]);
ai++;
bi++;
}
}
return result;
}
我尝试在我的代码中根据需要实现它。
var allItems = [];
var items = [1,2,3,4,5,6,7]
allItems.push(items);
allItems.push([1,2,4,9,100,1000])
allItems.push([1,2,3,4,5,9,100])
for(var i=0; i < allItems.length; i++){
//iterate through item
console.log("items "+ items);
console.log("allItems id: "+allItems[i]);
items = intersect_safe(items,allItems[i]);
console.log("items: "+items);
}
如果我对数组的每个索引中的实际值使用该函数,我会看到返回一个正确的交集,这样我在最终的“items”数组中只有“1,2,4”作为值。在这个循环中,函数似乎每次都返回原始值。遗漏任何明显的道歉......如果数组中的每个索引都包含一个我可以深入研究的数组本身,我就无法在逻辑中找到中断。
答案 0 :(得分:1)
在数学上你正在寻找两组的交集。
快速堆栈溢出检查产生:
Simplest code for array intersection in javascript
<强>更新强> 这是一个简单的例子,说明如何对三个数组使用intersect_safe方法。
var array1 = [3,4,5];
var array2 = [2,3,4];
var array3 = [1,2,3];
function intersect_safe(a, b)
{
var ai=0, bi=0;
var result = new Array();
while( ai < a.length && bi < b.length )
{
if (a[ai] < b[bi] ){ ai++; }
else if (a[ai] > b[bi] ){ bi++; }
else /* they're equal */
{
result.push(a[ai]);
ai++;
bi++;
}
}
return result;
}
var intersectArray = intersect_safe(array1,array2);
intersectArray = intersect_safe(intersectArray, array3);
console.log(intersectArray); //logs 3
希望这个例子可以帮助你扩展递归函数:)