2016-10-30 17 views
1

Ich habe 2 Array von Objekt, möchte nur prüfen, ob in einem vorhanden sind, wenn ja, fügen Sie eine neue Eigenschaft hinzu. aber die Länge von b ist dynamisch. Ich werde Fehler von undefiniert von b bekommen.Überprüfen, ob Array von Objektwert in einem anderen Array aber unterschiedlicher Länge vorhanden ist

var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}]; 
var b = [{name:'john'},{name:'joe'}]; 

var exist = 0; 
var c = _.map(a,function(result,i){ 
    exist = b[i].name.indexOf(a.name) > -1 ? exist = 1 : exist = 0; 

    return _.extend({},c,{'exist':exist}); 
}); 

irgendein Hinweis?

Antwort

3

Ich würde über b Objekte iterieren und für jeden von ihnen prüfen, ob sie in A existieren, wie im folgenden Beispiel.

var a = [ { _id: '5815adb4badf3f311a2cd25b', username: 'david&jane' }, 
 
    { _id: '5815e40e136c8e33b65b3478', username: 'david+jane' } ]; 
 
    var b = [ { username: 'david&jane' }, 
 
       { username: 'david<3jane' }, 
 
       { username: 'david+jane' }, 
 
       { username: 'davidjane' } 
 
    ] 
 
    var c = []; 
 

 
    b.forEach(function(user) { 
 
     var exists = false; 
 
     for (let i=0; i<a.length && !exists; i++){ 
 
      exists = a[i].username === user.username ; 
 
     } 
 
     
 
     c.push(Object.assign({},user,{exists})); 
 
    }); 
 

 
    console.log(c);

+0

was Object.assign ist, so dass sie noch nie zuvor gesehen, ES6? –

+0

Ja, nehmen Sie an, wie Ihre '_.extend ({}, c, {'exist': exist});' – naortor

+0

nehmen Sie an, ich habe ein extra ID-Feld, dann kann ich nicht Ihre Lösung anwenden, etwas dagegen schau warum? http://pastebin.com/1PTPZpkc –

1

Erste stringifya Array. Schleife durch b und erstelle einen dynamischen Regex, der auf a getestet wird, wenn die Testübereinstimmungen deine Sachen machen.

Hoffe, das hilft!

var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}]; 
 
var b = [{name:'john'},{name:'joe'}, {name:'hello'}]; 
 

 
var strA = JSON.stringify(a) 
 

 
var result = b.map((el) => { 
 
    var elStr = JSON.stringify(el) 
 
    var regex = new RegExp(elStr, 'g') 
 
    if(regex.test(strA)) 
 
    return Object.assign({}, el, {exist: 1}) 
 
    return Object.assign({}, el, {exist: 0}) 
 
}) 
 

 
console.log(result)

+0

Grund für den Downvote? –

+0

Ich habe nicht downvote, aber das scheint mir zu kompliziert. –

+0

Es ist die einfachste Antwort mit einer Schleife. –

1

Sie Array.every verwenden könnte zu überprüfen, dass jedes Objekt in b ist auch in a, und in den Rückruf können Sie Array.some verwenden a für Schlüssel zu überprüfen und Werte

var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}]; 
 
var b = [{name:'john'},{name:'joe'}]; 
 

 
var exist = b.every((o) => { 
 
    let k = Object.keys(o)[0]; 
 
    return a.some(p => k in p && p[k] === o[k]); 
 
}); 
 

 
console.log(exist)

Wenn Sie Eigenschaften hinzufügen möchten, können Sie das tun auch

var a = [{name:'john'},{name:'james'},{name:'jordan'},{name:'joe'}]; 
 
var b = [{name:'john'},{name:'joe'}]; 
 

 
var c = b.map((o) => { 
 
    let k = Object.keys(o)[0]; 
 
    return o.exist = a.some(p => k in p && p[k] === o[k]), o; 
 
}); 
 

 
console.log(c);

+0

Hey, das erste Beispiel sollte zweimal 'wahr' zurückgeben, nicht wahr? –

+0

Nun, nein, ich habe das erste Beispiel nur mit true oder false zurückgegeben, basierend darauf, ob alle Objekte in "b" in "a" sind oder nicht. – adeneo

+0

Verstanden. Vielen Dank! –

Verwandte Themen