2016-11-11 3 views
1

Скажем, у меня есть следующие два массива:Фильтрующие Массивы в JavaScript,

var arrOne = [1, 4, 7]; 
var arrTwo = [1, 2, 3, 4, 5]; 
var arrThree = []; 

Я хотел бы itterate над arrTwo и, если он содержит элемент, который также находится в arrOne, удалите его из arrTwo, и вставить его в arrThree. Таким образом, глядя на выше массивы состояние массивов впоследствии должно выглядеть следующим образом:

var arrOne = [1, 4, 7]; 
var arrTwo = [2, 3, 5]; 
var arrThree = [1, 4]; 

Может кто-нибудь мне точку в правильном направлении, и лучший способ пойти по этому поводу? Если код предоставлен, поэтапное объяснение действительно будет оценено, чтобы я мог понять, что происходит.

+1

даже просто 'for' цикл может быть использован, что это ваши усилия? Вы можете получить представление о своем предыдущем вопросе. http://stackoverflow.com/questions/39972283/javascript-filtering-by-comparing-two-arrays – Satpal

ответ

5

Простая петля, соответствующая совпадениям indexOf и сращивания.

var arrOne = [1, 4, 7]; 
 
var arrTwo = [1, 2, 3, 4, 5]; 
 
var arrThree = []; 
 
for (var i = 0; i < arrTwo.length; i++) { 
 
    if (arrOne.indexOf(arrTwo[i]) >= 0) { 
 
    arrThree.push(arrTwo[i]); 
 
    arrTwo.splice(i, 1); 
 
    i--; 
 
    } 
 
} 
 

 
console.log(arrOne, arrTwo, arrThree)

Array.IndexOf

Array.splice

3

Посмотрите в Underscore библиотеку. Все элементы arrOne, которые также находятся в arrTwo, называются _.intersection().

2

Используйте простой цикл while с использованием методов Array#splice и Array#unshift.

var arrOne = [1, 4, 7]; 
 
var arrTwo = [1, 2, 3, 4, 5]; 
 
var arrThree = []; 
 
// get length of array 
 
var l = arrTwo.length; 
 
// iterate over array from the end 
 
while (l--) { 
 
    // check value present in arrOne 
 
    if (arrOne.indexOf(arrTwo[l]) > -1) 
 
    // if present then remove and insert it 
 
    // at the beginning of arrThree 
 
    arrThree.unshift(arrTwo.splice(l, 1)[0]) 
 
} 
 

 
console.log(arrTwo, arrThree);

0

Привет Вы можете использовать функцию фильтра для фильтрации массива. попробуйте использовать код ниже.

var arrOne = [1, 4, 7]; 
    var arrTwo = [2, 3, 5, 1]; 
    var arrThree = []; 

    function checkValue(a) { 
     return !arrOne.indexOf(a); 
    } 

    function checkValue2(a) { 
     return arrThree.indexOf(a); 
    } 
    function myFunction() { 
     arrThree = arrTwo.filter(checkValue); 
     document.getElementById("demo").innerHTML = arrThree ; 
     arrTwo = arrTwo.filter(checkValue2); 
     document.getElementById("demo1").innerHTML = arrTwo; 

    } 
0

var arrOne = [1, 4, 7]; 
 
var arrTwo = [1, 2, 3, 4, 5]; 
 

 

 
var arrThree = diff(arrOne,arrTwo);//passes the two arrays 
 
console.log(arrThree); 
 

 

 
function diff(one, two){ 
 
    one.forEach(function(e1){ //iterate through the first array 
 
    
 
    two.forEach(function(e2){//iterate through second 
 
     
 
     if(e1 == e2) //checking if elements are equal 
 
     two.pop(e2);//removing from second array 
 
    
 
    }); 
 
}); 
 
    return two; //returning new array 
 
}

Вы можете использовать подчеркивание JS для простых операций с массивами, операция разница будет _.difference([1, 2, 3, 4, 5], [5, 2, 10]);.

0
var array1 = [1, 2, 3, 4, 5, 6], 
    var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

    var common = $.grep(array1, function(element) { 
    return $.inArray(element, array2) !== -1; 
    }); 

    console.log(common); // returns [1, 2, 3, 4, 5, 6];   

    array2 = array2.filter(function(obj) { 
    return array1.indexOf(obj) == -1; 
    }); 

    // returns [7,8,9]; 
0

Поскольку массивы отсортированы, вы можете прочитать их параллельно: O (n) вместо O (n2). Не использовать библиотеку для такой простой задачи, это перебор :-)

var i = 0, j = 0; 
 
var a = [1, 4, 7]; 
 
var b = [1, 2, 3, 4, 5]; 
 
var c = []; 
 

 
while (i < a.length && j < b.length) { 
 
    if (a[i] < b[j]) i++; 
 
    else if (a[i] > b[j]) j++; 
 
    else c.push(b.splice(j, 1)[0]); 
 
} 
 

 
console.log("a " + toString(a)); 
 
console.log("b " + toString(b)); 
 
console.log("c " + toString(c)); 
 

 
function toString (v) { 
 
    return "[ " + v.join(" ") + " ]"; 
 
}

Трассировка:

#0 init 

    a = [ 1 4 7 ] 
     i 
    b = [ 1 2 3 4 5 ] 
     j 
    c = [] 

#1 a[i] = b[j] => move b[j] to c 

    a = [ 1 4 7 ] 
     i 
    b = [ 2 3 4 5 ] 
     j 
    c = [ 1 ] 

#2 a[i] < b[j] => increment i 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 4 5 ] 
     j 
    c = [ 1 ] 

#3 a[i] > b[j] => increment j 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 4 5 ] 
      j 
    c = [ 1 ] 

#4 a[i] > b[j] => increment j 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 4 5 ] 
      j 
    c = [ 1 ] 

#5 a[i] = b[j] => move b[j] to c 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 5 ] 
      j 
    c = [ 1 4 ] 

#6 a[i] < b[j] => increment i 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 5 ] 
      j 
    c = [ 1 4 ] 

#7 a[i] > b[j] => increment j 

    a = [ 1 4 7 ] 
      i 
    b = [ 2 3 5 ] 
       j 
    c = [ 1 4 ] 

#8 j = length of b => done 
Смежные вопросы