2015-05-22 2 views
4

Я пытался реализовать функцию, где дается с двумя массивами,Сравнение и фильтрация двух массивов

Array1 элементы «s используется в качестве условия, чтобы отфильтровать элементы в массив2.

Например:

array1= [apple, grapes, oranges] 

array2= [potato, pears, grapes, berries, apples, oranges] 

После подачи в функции, array2 должны иметь элементы, как, например:

filter_twoArrays(array1,array2) 

array2= [grapes, apples, oranges] 

Я попытался следующий код, используя для петель и Array.splice (), но проблема, которую я вижу, заключается в том, что когда я использую метод сплайсинга, кажется, что он меняет длину массива2 в цикле обработки:

function filter_twoArrays(filter,result){ 

    for(i=0; i< filter.length; i++){ 
    for(j=0; j< result.length; j++){ 
     if(filter[i] !== result[j]){ 
     result.splice(j,1) 
     } 
    } 
    } 

Любые входы будут приниматься с благодарностью за то, как улучшить функцию фильтра

ура!

+0

В PHP вы можете использовать 'array_intersect', но ваш код, кажется, немного как JS – pbaldauf

+0

возможный дубликат [простейшими код для пересечения массива в JavaScript] (http://stackoverflow.com/questions/1885557/simpleest-code-for-array-intersection-in-javascript) – georg

+0

Является ли порядок элементов в массиве result2 важным для вас? – Arvind

ответ

0

Привет, это портирование функции array_intersect php. Должно быть хорошо для вас http://phpjs.org/functions/array_intersect/

function array_intersect(arr1) { 
    // discuss at: http://phpjs.org/functions/array_intersect/ 
    // original by: Brett Zamir (http://brett-zamir.me) 
    //  note: These only output associative arrays (would need to be 
    //  note: all numeric and counting from zero to be numeric) 
    // example 1: $array1 = {'a' : 'green', 0:'red', 1: 'blue'}; 
    // example 1: $array2 = {'b' : 'green', 0:'yellow', 1:'red'}; 
    // example 1: $array3 = ['green', 'red']; 
    // example 1: $result = array_intersect($array1, $array2, $array3); 
    // returns 1: {0: 'red', a: 'green'} 

    var retArr = {}, 
    argl = arguments.length, 
    arglm1 = argl - 1, 
    k1 = '', 
    arr = {}, 
    i = 0, 
    k = ''; 

    arr1keys: for (k1 in arr1) { 
    arrs: for (i = 1; i < argl; i++) { 
     arr = arguments[i]; 
     for (k in arr) { 
     if (arr[k] === arr1[k1]) { 
      if (i === arglm1) { 
      retArr[k1] = arr1[k1]; 
      } 
      // If the innermost loop always leads at least once to an equal value, continue the loop until done 
      continue arrs; 
     } 
     } 
     // If it reaches here, it wasn't found in at least one array, so try next value 
     continue arr1keys; 
    } 
    } 

    return retArr; 
} 
0

Так как вы пометили JavaScript здесь решение.

function f1(x, y) { 
    var t = y.slice(0); 
    var r = []; 
    for (var i = 0; i < x.length; i++) { 
     for (var j = 0; j < y.length; j++) { 
      if (x[i] === y[j]) { 
       [].push.apply(r, t.splice(j, 1)); 
      } 
     } 
    } 
    console.log(r) 
    y.length = 0; 
    [].push.apply(y, r); 
} 
0

Вот один простой способ, основанный на коде

function array_filter(filter, result) { 
    var filterLen = filter.length; 
    var resultLen = result.length; 

    for (i = 0; i < resultLen; i++) { 
     for (j = 0; j < filterLen; j++) { 
      if (!contains(filter, result[i])) 
       result.splice(i, 1); 
     } 
    } 
} 

//Return boolean depending if array 'a' contains item 'obj' 
function contains(array, value) { 
    for (var i = 0; i < array.length; i++) { 
     if (array[i] == value) { 
      return true; 
     } 
    } 
    return false; 
} 
0

Марк элементы, которые должны быть отфильтрованы с помощью delete result[index] манипулировать их по мере необходимости.

JavaScript

window.onload = runs; 

function runs() { 
    var array1 = ["apples", "grapes", "oranges"]; 
    var array2 = ["potato", "pears", "grapes", "berries", "apples", "oranges"]; 
    var result = filter_twoArrays(array1, array2); 

    function filter_twoArrays(filter, result) { 
     var i = 0, 
      j = 0; 
     for (i = 0; i < result.length; i++) { 
      var FLAG = 0; 
      for (j = 0; j < filter.length; j++) { 
       if (filter[j] == result[i]) { 
        FLAG = 1; 
       } 
      } 
      if (FLAG == 0) delete result[i]; 
     } 
     return result; 
    } 

    var body = document.getElementsByTagName("body")[0]; 
    var i = 0; 
    for (i = 0; i < result.length; i++) { 
     if (result[i] !== undefined) 
      body.innerHTML = body.innerHTML + result[i] + " "; 
    } 
} 
2

Вы можете использовать filter как последуйте

var array1 = ['apples', 'grapes', 'oranges', 'banana'], 
 
    array2 = ['potato', 'pears', 'grapes', 'berries', 'apples', 'oranges']; 
 

 
var intersection = array1.filter(function(e) { 
 
    return array2.indexOf(e) > -1; 
 
}); 
 

 
console.log(intersection);

Вы также можете добавить этот метод массива прототипа и вызвать его непосредственно на массиве

Array.prototype.intersection = function(arr) { 
 
    return this.filter(function(e) { 
 
    return arr.indexOf(e) > -1; 
 
    }); 
 
}; 
 

 
var array1 = ['apples', 'grapes', 'oranges', 'banana'], 
 
    array2 = ['potato', 'pears', 'grapes', 'berries', 'apples', 'oranges']; 
 

 
var intersection = array1.intersection(array2); 
 
console.log(intersection);

+0

С ES6 'arr1.filter (e => arr2.includes (e))'. – Tushar