2015-03-10 4 views
0

У меня есть функция, которая выталкивает значения в массив (очень упрощенный пример ниже):Проверьте, сколько раз появляется неопределенное значение массива в этом массиве

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] 

Я бегу цикл по каждому из «обр «массивы, чтобы подтолкнуть их значения к« 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-х массивах (214 и 218). Является ли проблема в том, где я удаляю splice на myArr, потому что цикл все еще проходит через все?

Update:

Используя пример здесь: 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); 
} 

Если я использую функцию от фактических значений, которые находятся в каждом индексе массива, я вижу правильное пересечение возвращается, так что у меня есть только «1,2,4» в качестве значений в финале " элементов ". В этом цикле функция, кажется, возвращает исходное значение каждый раз. Извиняюсь за отсутствие чего-то вопиющего ... Я просто не могу найти разрыв в логике, если каждый индекс в массиве содержит сам массив, в который я могу углубиться.

+0

'concat' возвращает новый массив, поэтому' myArr' не получает новые предметы, если это то, что вы имели в виду сделать. – elclanrs

+0

ах хорошо .. ну, что я на самом деле сделал, это использовать .push в цикле for на каждом из массивов. Я просто попытался сделать это простым в этом примере. Извините, я изменю его. –

ответ

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 

Надежда этот пример поможет вам расширить функции для рекурсии :)

+1

Welp. Собирался опубликовать это! Напомним, что пересечение множества множеств совпадает с пересечением первых двух, а затем рекурсивно пересекает результат с остальными в любом порядке. – Sergio

+0

У меня все еще есть проблема. Функция работает, пока я не попытаюсь вызвать ее в моем массиве. Я не уверен, есть ли проблемы с этим, или если я просто бредовый в 2 часа ночи. Я обновил свой вопрос. –

+0

Спасибо, @ Серхио. Это имеет смысл для меня, поэтому я попытался использовать это, постоянно проверяя тот же массив в моем примере. –

Смежные вопросы