2015-10-06 11 views
11

ecco il mio caso d'uso in JavaScript:Confrontando due array di oggetti, ed escludere gli elementi che corrispondono a valori in nuovo array in JS

ho due array di oggetti che hanno proprietà che corrispondono (id & nome).

var result1 = [ 
    {id:1, name:'Sandra', type:'user', username:'sandra'}, 
    {id:2, name:'John', type:'admin', username:'johnny2'}, 
    {id:3, name:'Peter', type:'user', username:'pete'}, 
    {id:4, name:'Bobby', type:'user', username:'be_bob'} 
]; 

var result2 = [ 
    {id:2, name:'John', email:'[email protected]'}, 
    {id:4, name:'Bobby', email:'[email protected]'} 
]; 

var props = ['id', 'name']; 

Il mio obiettivo è disporre di un'altra matrice di oggetti contenente solo gli elementi che non corrispondono. Come questo:

var result = [ 
    {id:1, name:'Sandra'}, 
    {id:3, name:'Peter'} 
]; 

So che c'è un modo di fare questo andando da result1 confrontare ogni oggetto con gli oggetti della result2, quindi confrontare le loro chiavi, e se did'n partita, mettere i valori in un altro l'oggetto quindi lo spinge in un nuovo array, ma mi chiedo se ci sia un modo più elegante, come usare lo-dash o underscore o qualcosa di simile.

Grazie!

+0

Condividere la vostra ricerca aiuta tutti. Dicci cosa hai provato e perché non ha soddisfatto le tue esigenze.Questo dimostra che ti sei preso del tempo per cercare di aiutare te stesso, ci salva dal ribadire risposte ovvie e soprattutto ti aiuta a ottenere una risposta più specifica e pertinente! Vedi anche [come chiedere] (http://stackoverflow.com/questions/how-to-ask) – Cerbrus

+0

Esplora tu stesso: [1] (http://underscorejs.org/#arrays), [2] (https : //lodash.com/docs). – hindmost

+0

prova questo: http://stackoverflow.com/questions/368280/javascript-hashmap-equivalent –

risposta

21

semplicemente utilizzando il Array iteration methods integrato in JS è bene per questo:

var result1 = [ 
 
    {id:1, name:'Sandra', type:'user', username:'sandra'}, 
 
    {id:2, name:'John', type:'admin', username:'johnny2'}, 
 
    {id:3, name:'Peter', type:'user', username:'pete'}, 
 
    {id:4, name:'Bobby', type:'user', username:'be_bob'} 
 
]; 
 

 
var result2 = [ 
 
    {id:2, name:'John', email:'[email protected]'}, 
 
    {id:4, name:'Bobby', email:'[email protected]'} 
 
]; 
 

 
var props = ['id', 'name']; 
 

 
var result = result1.filter(function(o1){ 
 
    // filter out (!) items in result2 
 
    return !result2.some(function(o2){ 
 
     return o1.id === o2.id;   // assumes unique id 
 
    }); 
 
}).map(function(o){ 
 
    // use reduce to make objects with only the required properties 
 
    // and map to apply this to the filtered array as a whole 
 
    return props.reduce(function(newo, name){ 
 
     newo[name] = o[name]; 
 
     return newo; 
 
    }, {}); 
 
}); 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + 
 
     '</pre>';

Se si sta facendo questo molto, poi con tutti i mezzi guardare librerie esterne per aiutarvi, ma vale la pena imparare prima le basi e le basi ti serviranno bene qui.

1

Verificare la differenza e xor in lodash.

7

Lo stesso risultato può essere ottenuto utilizzando Lodash.

var result1 = [ 
 
    {id:1, name:'Sandra', type:'user', username:'sandra'}, 
 
    {id:2, name:'John', type:'admin', username:'johnny2'}, 
 
    {id:3, name:'Peter', type:'user', username:'pete'}, 
 
    {id:4, name:'Bobby', type:'user', username:'be_bob'} 
 
]; 
 

 
var result2 = [ 
 
    {id:2, name:'John', email:'[email protected]'}, 
 
    {id:4, name:'Bobby', email:'[email protected]'} 
 
]; 
 

 
var result3 = _(result1) 
 
     .differenceBy(result2, 'id', 'name') 
 
     .map(_.partial(_.pick, _, 'id', 'name')) 
 
     .value(); 
 

 
console.log(result3);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

è possibile ottenere il risultato desiderato applicando una differenza tra i due array utilizzando la proprietà "id" e "nome" come un modo per gli elementi "link" tra di loro. Se una di queste proprietà è diversa, gli elementi sono considerati diversi (improbabile nel tuo caso perché l'ID sembra essere unico).

Infine, è necessario mappare il risultato per "omettere" le proprietà indesiderate dell'oggetto.

Spero che aiuti.

1

beh, questo usando lodash o vanilla javascript dipende dalla situazione.

ma solo per restituire la matrice che contiene i duplicati che può essere raggiunto dal seguente, offcourse è stato preso da @ 1983

var result = result1.filter(function (o1) { 
    return result2.some(function (o2) { 
     return o1.id === o2.id; // return the ones with equal id 
    }); 
}); 
// if you want to be more clever... 
let result = result1.filter(o1 => result2.some(o2 => o1.id === o2.id)); 
2

Ho cercato molto per una soluzione in cui posso confrontare due array di oggetti con nomi di attributi diversi (qualcosa come un join esterno sinistro). Ho trovato questa soluzione. Qui ho usato Lodash. Spero che questo ti possa aiutare.

var Obj1 = [ 
    {id:1, name:'Sandra'}, 
    {id:2, name:'John'}, 
]; 

var Obj2 = [ 
    {_id:2, name:'John'}, 
    {_id:4, name:'Bobby'} 
]; 

var Obj3 = lodash.differenceWith(Obj1, Obj2, function (o1, o2) { 
    return o1['id'] === o2['_id'] 
}); 

console.log(Obj3); 
// {id:1, name:'Sandra'} 
+0

Risposta semplice e pulita! –

0

Ecco un'altra soluzione utilizzando Lodash:

var _ = require('lodash'); 

var result1 = [ 
    {id:1, name:'Sandra', type:'user', username:'sandra'}, 
    {id:2, name:'John', type:'admin', username:'johnny2'}, 
    {id:3, name:'Peter', type:'user', username:'pete'}, 
    {id:4, name:'Bobby', type:'user', username:'be_bob'} 
]; 

var result2 = [ 
    {id:2, name:'John', email:'[email protected]'}, 
    {id:4, name:'Bobby', email:'[email protected]'} 
]; 

// filter all those that do not match 
var result = types1.filter(function(o1){ 
    // if match found return false 
    return _.findIndex(types2, {'id': o1.id, 'name': o1.name}) !== -1 ? false : true; 
}); 

console.log(result); 
Problemi correlati