2016-07-06 15 views
0

Gegeben zwei Arrays:Javascript/JQuery Array von Objekten Kreuzung von Eigentum

var users = [{ name: 'Alice', typeID: 1 }, { name: 'Bob', typeID: 2 }, { name: 'Carol', typeID: 3 }]; 
var authorized = [{ typeID: 1 }, { typeID: 2 }]; 

Ich mag die einfachste Art und Weise wissen, alle Benutzer mit TypeId zu erhalten, die in der autorisierten Array vorhanden ist.

In diesem Fall sollte das Ergebnis sein:

[{ name: 'Alice', typeID: 1 }, { name: 'Bob', typeID: 2 }] 
+1

Bitte versucht Lösungen umfassen, warum sie nicht funktioniert hat, und die erwarteten Ergebnisse. Das würde uns wirklich helfen, das Problem mit Ihrem Code herauszufinden. Vielen Dank! –

+1

Verwenden Sie ['.map'] (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map) und [' .filter'] (https://developer.mozilla.org/docs/Web/JavaScript/Referenz/Global_Objects/Array/filter) –

+1

['Array.prototype.filer()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Array/filter) und eine Schleife – Andreas

Antwort

3
var result = users.filter(function(user) { 
    return authorized.some(function(authorizedObj) { 
    return authorizedObj.typeID === user.typeID; 
    }); 
}) 

Beachten Sie, dass, wenn Ihr autorisiertes Array nur die IDs und nicht Objekte enthielt (etwas wie [1, 2]), dann wäre die Lösung einfacher:

var result = users.filter(function(user) { 
    return authorized.indexOf(user.typeID) !== -1; 
}) 
0

Sie

var types = authorized.reduce(function(types, type) { types.push(type.typeID); return types; }, []); 

var usersMatched = users.filter(function(user) { return types.indexOf(user.typeID) !== -1;}); 

vielleicht können es eine effizientere Lösung ist, aber es ist etwas, mit zu beginnen

1

Dies ist eine kurze Lösung mit linearer Komplexität, O (n + m), und mit Hilfe eines Map.

var users = [{ name: 'Alice', typeID: 1 }, { name: 'Bob', typeID: 2 }, { name: 'Carol', typeID: 3 }], 
 
    authorized = [{ typeID: 1 }, { typeID: 2 }], 
 
    map = new Map, 
 
    result; 
 

 
authorized.forEach(a => map.set(a.typeID, true)); 
 
result = users.filter(a => map.has(a.typeID)); 
 

 
console.log(result);

+0

O (m + n) - O (2n) - O (n) –

+0

@mortezaT, was bedeutet '~' in diesem Fall? –

+0

Sie sind ähnlich und können ersetzt werden; O (n) und O (2n) werden als O (n) betrachtet. –