wake-up-neo.com

Vergleichen Sie zwei Arrays von Objekten und schließen Sie die Elemente aus, die Werte in ein neues Array in JS passen

hier ist mein Anwendungsfall in JavaScript:

Ich habe zwei Arrays von Objekten, deren Eigenschaften übereinstimmen (ID und Name).

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'];

Mein Ziel ist es, ein anderes Array von Objekten zu haben, das nur die Elemente enthält, die nicht übereinstimmen. So was:

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

Ich weiß, dass es einen Weg gibt, dies zu tun, indem Sie von result1 aus jedes Objekt mit den Objekten von result2 vergleichen, dann ihre Schlüssel vergleichen. Wenn dies nicht der Fall ist, geben Sie die Werte in ein anderes Objekt ein, und drücken Sie es in ein neues Array Wunder, gibt es keinen eleganteren Weg, wie zum Beispiel lo-dash oder Unterstrich oder ähnliches.

Vielen Dank!

20
Leo

Die Verwendung der Array-Iterationsmethoden in JS ist dafür gut geeignet:

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>';

Wenn Sie dies häufig tun, sollten Sie unbedingt auf externe Bibliotheken zurückgreifen, um Ihnen zu helfen. Es lohnt sich jedoch, zunächst die Grundlagen zu erlernen, und die Grundlagen werden Ihnen hier gute Dienste leisten.

33
1983

nun, dies mit lodash oder Vanilla Javascript hängt von der Situation ab.

um jedoch nur das Array zurückzugeben, das die Duplikate enthält, kann es durch folgendes erreicht werden

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));
19
blackend

Das gleiche Ergebnis kann mit Lodash erreicht werden.

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>

Sie können das gewünschte Ergebnis erhalten, indem Sie eine Differenz zwischen beiden Arrays verwenden, indem Sie die Eigenschaften "id" und "name" verwenden, um Elemente zwischen diesen Arrays zu "verknüpfen". Wenn sich eine dieser Eigenschaften unterscheidet, werden die Elemente als unterschiedlich betrachtet (in Ihrem Fall unwahrscheinlich, da die ID eindeutig zu sein scheint).

Als letztes müssen Sie das Ergebnis abbilden, um die unerwünschten Eigenschaften des Objekts "wegzulassen".

Ich hoffe es hilft.

10
acontell

Ich habe viel nach einer Lösung gesucht, bei der ich zwei Arrays von Objekten mit unterschiedlichen Attributnamen vergleichen kann (etwa einem Left Outer Join). Ich habe mir diese Lösung ausgedacht. Hier habe ich Lodash benutzt. Ich hoffe, dies wird dir helfen. 

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'}
7
apurvasharma

Check out Unterschied und xor in lodash.

2
jedierikb

Hier ist eine andere Lösung mit 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);
0