【发布时间】:2015-03-10 22:23:27
【问题描述】:
我有一个将值推入数组的函数(下面非常简化的示例):
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 上删除拼接,因为循环仍在遍历所有内容?
更新:
使用此处的示例: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”作为值。在这个循环中,函数似乎每次都返回原始值。很抱歉遗漏了任何明显的东西......如果数组中的每个索引都包含一个我可以深入挖掘的数组本身,我就是找不到逻辑中断。
【问题讨论】:
-
concat返回一个新数组,因此如果您打算这样做,myArr不会获取新项目。 -
啊好吧..我实际上做的是在每个数组的 for 循环中使用 .push。我只是试图在这个例子中让它变得简单。对不起,我会改的。
标签: javascript arrays