Hoe vind ik overeenkomende waarden in twee arrays?

Ik heb twee arrays en ik wil de twee kunnen vergelijken en alleen de waarden retourneren die overeenkomen. Beide arrays hebben bijvoorbeeld de waarde cat, dus dat is wat wordt geretourneerd. Ik heb zoiets niet gevonden. Wat zou de beste manier zijn om overeenkomsten terug te geven?

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
//if value in array1 is equal to value in array2 then return match: cat

Antwoord 1, autoriteit 100%

U kunt gebruiken:

const intersection = array1.filter(element => array2.includes(element));

Antwoord 2, autoriteit 18%

Natuurlijk was mijn aanpak om de eerste array één keer te doorlopen en de index van elke waarde in de tweede array te controleren. Als de index > -1en pushhet vervolgens op de geretourneerde array.

​Array.prototype.diff = function(arr2) {
    var ret = [];
    for(var i in this) {   
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};


Mijn oplossing maakt geen gebruik van twee lussen zoals andere, dus het kan een beetje sneller werken. Als u het gebruik van for..inwilt vermijden, kunt u beide arrays eerst sorteren om al hun waarden opnieuw te indexeren:

Array.prototype.diff = function(arr2) {
    var ret = [];
    this.sort();
    arr2.sort();
    for(var i = 0; i < this.length; i += 1) {
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

Gebruik ziet er als volgt uit:

var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
console.log(array1.diff(array2));

Als je een probleem/probleem hebt met het uitbreiden van het Array-prototype, kun je dit gemakkelijk veranderen in een functie.

var diff = function(arr, arr2) {

En je zou overal waar de func oorspronkelijk thiszei, veranderen in arr2.


Antwoord 3, autoriteit 9%

Ik ontdekte dat een kleine wijziging in wat @jota3 voorstelde perfect voor mij werkte.

var intersections = array1.filter(e => array2.indexOf(e) !== -1);

Hopelijk helpt dit!


Antwoord 4, autoriteit 4%

Deze functie werkt in O(n log(n) + m log(m))vergeleken met O(n*m)(zoals gezien in de andere oplossingen met loops/indexOf) wat handig kan zijn als je met veel waarden te maken hebt.

Echter, omdat geen van beide "a" > 1noch "a" < 1, dit werkt alleen voor elementen van hetzelfde type.

function intersect_arrays(a, b) {
    var sorted_a = a.concat().sort();
    var sorted_b = b.concat().sort();
    var common = [];
    var a_i = 0;
    var b_i = 0;
    while (a_i < a.length
           && b_i < b.length)
    {
        if (sorted_a[a_i] === sorted_b[b_i]) {
            common.push(sorted_a[a_i]);
            a_i++;
            b_i++;
        }
        else if(sorted_a[a_i] < sorted_b[b_i]) {
            a_i++;
        }
        else {
            b_i++;
        }
    }
    return common;
}

Voorbeeld:

var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]

Antwoord 5, autoriteit 4%

Loop door de tweede array telkens wanneer u over een element in de eerste array hoort, controleer dan op wedstrijden.

var array1 = ["cat", "sum", "fun", "run"],
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
function getMatch(a, b) {
    var matches = [];
    for ( var i = 0; i < a.length; i++ ) {
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i] === b[e] ) matches.push( a[i] );
        }
    }
    return matches;
}
getMatch(array1, array2); // ["cat"]

6, Autoriteit 3%

var array1  = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var array3 = array2.filter(function(obj) { 
    return array1.indexOf(obj) == -1; 
});

7

Gebruik Lodash

GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];
var result = utils.difference(arr1 , arr2);
console.log ( "result :" + result );

8

Gedaan als een antwoord, zodat ik kan opmaken …

Dit is het proces dat u nodig hebt om door te gaan. Loop door een array voor de details.

create an empty array
loop through array1, element by element. {
  loop through array2, element by element {
    if array1.element == array2.element {
      add to your new array
    }
  }
}

9

Als uw waarden niet-null-strings of cijfers zijn, kunt u een object gebruiken als woordenboek:

var map = {}, result = [], i;
for (i = 0; i < array1.length; ++i) {
    map[array1[i]] = 1;
}
for (i = 0; i < array2.length; ++i) {
    if (map[array2[i]] === 1) {
        result.push(array2[i]);
        // avoid returning a value twice if it appears twice in array 2
        map[array2[i]] = 0;
    }
}
return result;

10

Bibliotheken zoals Underscore en Lodash hebben een hulpprogramma-methode die intersectionom wedstrijden in arrays te vinden die zijn ingeschakeld. Kijk eens naar: http://underscorejs.org/#intersection


11

Met sommige ES6:

let sortedArray = [];
firstArr.map((first) => {
  sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);

Dit snippet sorteert ook de firstarr op basis van de volgorde van de Defaultarray

Zoals:

let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];

Antwoord 12

Itereer op array1 en zoek het indexof-element dat aanwezig is in array2.

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","sun", "hut", "gut"];
var str='';
for(var i=0;i<array1.length;i++){
        if(array2.indexOf(array1[i]) != -1){
           str+=array1[i]+' ';
       };
    }
console.log(str)

Other episodes