2017-02-11 4 views
4

Я попытался рассмотреть подобный вопрос в переполнении стека, но он не удовлетворял точно, что я пытаясь сделать, и я продолжаю пытаться заставить его работать, но постоянно получаю неправильные результаты. В этот момент я просто в недоумении. Пример того, что я имею в видуФункция JavaScript, которая принимает многомерный массив и один массив, и находит совпадения одиночного массива в массиве multi-d

var masterArray = [[1,2,5,6],[5,13,7,8],[9,11,13,15],[13,14,15,16],[1,9,11,12]] 
var compareArray = [9,11,13,15,1,2,5,6] 

function intersect(a, b) { 
//code to compare both arrays and find a match 
} 

console.log(Intersect(compareArray, masterArray)) 

И выход был бы

[9,11,13,15] 
[1,2,5,6] 
[5,13] 
[13,15] 
+0

Show (добавить к вашему вопросу) ваши лучшие усилия до сих пор и объяснить, где и почему вы застряли. –

+0

Проверьте выход снова! Я думаю, вы забыли его! –

+3

почему '[1,9,11]' не в конечном итоге? – RomanPerekhrest

ответ

0

Согласно вашей логике, то есть неправильный вывод в вашем вопросе:

var masterArray = [[1,2,5,6],[5,13,7,8],[9,11,13,15],[13,14,15,16],[1,9,11,12]] 
var compareArray = [9,11,13,15,1,2,5,6] 


function intersect(a, b) { 
    var temp = []; 
    k = 0; 
    for(i = 0; i < b.length; i++){ 
     temp1 = [] 
     for(j=0;j<b[i].length;j++){ 
     if($.inArray(b[i][j], a) > -1){ 
      temp1.push(b[i][j]); 

     } 
     } 
     temp.push(temp1); 
    } 
    return temp; 
} 

console.log(intersect(compareArray, masterArray)); 

Проверьте это jsfiddle.

Дайте ему попробовать, это должно сработать.

1

Использование Array.prototype.reduce, чтобы получить массив всех пересечений, как это:

var masterArray = [[1,2,5,6],[5,13,7,8],[9,11,13,15],[13,14,15,16],[1,9,11,12]]; 
 
var compareArray = [9,11,13,15,1,2,5,6]; 
 

 

 
function intersect(multi, simple) { 
 
    return multi.reduce(function(res, b) { 
 
    var intersection = simple.reduce(function(r, e) { // get the intersection of the current array and compareArray (simple) 
 
     if(b.indexOf(e) != -1) // if the current element of the current array is also in the compareArray then push it into the intersection array 
 
     r.push(e); 
 
     return r; 
 
    }, []); 
 
    
 
    res.push(intersection); // push the intersection array into the result array 
 
    return res; 
 
    }, []); 
 
} 
 

 
console.log(intersect(masterArray, compareArray));

1

Раствор с помощью RegExp объекта с конкретным шаблоном регулярного выражения (преобразование compareArray числа в регулярных выражений элементов Чередование групп).
Дополнительные функции используются: String.prototype.match(), Array.prototype.join(), Array.prototype.map()

var masterArray = [[1,2,5,6],[5,13,7,8],[9,11,13,15],[13,14,15,16],[1,9,11,12]], 
 
    compareArray = [9,11,13,15,1,2,5,6]; 
 

 
function intersect(compareArray, masterArray) { 
 
    var pattern = new RegExp('\\b(' + compareArray.join('|') + ')\\b', 'g'), 
 
     result = []; 
 

 
    masterArray.forEach(function(v) { 
 
     var matches = v.join(' ').match(pattern); 
 
     if (matches.length) result.push(matches.map(Number)); 
 
    }); 
 

 
    return result; 
 
} 
 

 
console.log(intersect(compareArray, masterArray));

0

Вы можете использовать эту функцию ES6:

function intersect(a, b) { 
 
    a = new Set(a); // for faster lookup 
 
    return b.map(c => c.filter(a.has.bind(a))).filter(Boolean); 
 
} 
 
// Demo 
 
const masterArray = [[1,2,5,6],[5,13,7,8],[9,11,13,15],[13,14,15,16],[1,9,11,12]]; 
 
const compareArray = [9,11,13,15,1,2,5,6]; 
 
console.log(intersect(compareArray, masterArray).join('\n'));

Часть .filter(Boolean) является необязательной и требуется только для исключения массивов, которые вообще не имеют соответствующих номеров, которые в противном случае представлялись пустым массивом в результате.

Использование Set улучшит характеристики, так как поиск в Sethas) может быть выполнен в почти постоянное время.

0

Вы можете отобразить отфильтрованный результат masterArray.

var masterArray = [[1, 2, 5, 6], [5, 13, 7, 8], [9, 11, 13, 15], [13, 14, 15, 16], [1, 9, 11, 12]], 
 
    compareArray = [9, 11, 13, 15, 1, 2, 5, 6], 
 
    result = masterArray.map(function (a) { 
 
     return a.filter(function (b) { 
 
      return compareArray.indexOf(b) !== -1; 
 
     }); 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6

var masterArray = [[1, 2, 5, 6], [5, 13, 7, 8], [9, 11, 13, 15], [13, 14, 15, 16], [1, 9, 11, 12]], 
 
    compareArray = [9, 11, 13, 15, 1, 2, 5, 6], 
 
    result = masterArray.map(a => a.filter(b => compareArray.includes(b))); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

  • Нет связанных вопросов^_^