【问题标题】:Check how many times an unspecified array value appears in that array检查未指定的数组值在该数组中出现的次数
【发布时间】: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


【解决方案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

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

【讨论】:

  • 求助。本来要发这个的!只是提醒一下,许多集合的交集与前两个相交相同,然后以任何顺序递归地与其他结果相交。
  • 我仍然遇到某种问题。该函数一直有效,直到我尝试在我的数组中调用它。我不确定它是否有问题,或者我只是在凌晨 2 点出现妄想。我已经更新了我的问题。
  • 谢谢@Sergio。这对我来说确实有意义,所以我尝试通过在我的示例中不断检查同一个数组来使用它。
  • 感谢您的更新!我的问题是我正在检查一个以数组作为第一个索引的数组,而不是仅仅将单个值推入..这一切都归结为一个臭变量:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多