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 > -1
en push
het 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..in
wilt 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 this
zei, 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" > 1
noch "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 intersection
om 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)