检查未指定的数组值在该数组中出现的次数

时间:2015-03-10 22:23:28

标签: javascript arrays

我有一个将值推送到数组中的函数(下面是非常简化的示例):

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”作为值。在这个循环中,函数似乎每次都返回原始值。遗漏任何明显的道歉......如果数组中的每个索引都包含一个我可以深入研究的数组本身,我就无法在逻辑中找到中断。

1 个答案:

答案 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

希望这个例子可以帮助你扩展递归函数:)