2017-12-22 3 views
1

Ich habe zwei Arrays von Benutzerobjekten mit _id und lastSeen.Vergleichen von zwei Arrays von Objekten und Aktualisieren von lastSeen basierend auf ID in Javascript

allUsersSeen = [ 
    {_id: '12csdf', lastSeen: 212512}, 
    {_id: '232csdf', lastSeen: 34345}, 
    {_id: '1253csdf', lastSeen: 6346453}, 
    {_id: '772csfddf', lastSeen: 2345345} 
] 

currentUsersSeen = [ 
    {_id: '12csdf', lastSeen: Date.now()}, 
    {_id: '1253csdf', lastSeen: Date.now()}, 
    {_id: '1fsdf', lastSeen: Date.now()} 
] 

Ich möchte diese beiden Arrays vergleichen und wenn die allUsersSeen _id zu currentUsersSeen Spiele Ich möchte lastSeen zu Date.now() aktualisieren. Alle anderen _id's behalten ihren letzten Stand zu dem was sie war.

sollte Ein verbleib _id von currentUsersSeen auf allUsersSeen geschoben werden mit einem lastSeen von Date.now()

Schluss Reihe von allUsersSeen sollte wie folgt aussehen:

allUsersSeen = [ 
    {_id: '12csdf', lastSeen: Date.now()}, 
    {_id: '232csdf', lastSeen: 34345}, 
    {_id: '1253csdf', lastSeen: Date.now()}, 
    {_id: '772csfddf', lastSeen: 2345345}, 
    {_id: '1fsdf', lastSeen: Date.now()} 
] 

Offensichtlich ist die Date.now()‘ s wird das aktuelle Datum/Uhrzeit sein. Wie würde ich das machen? Ich habe versucht, eine verschachtelte for-Schleife zu verwenden und versuchte, mit forEach() und map() herumzualbern.

Jede Hilfe würde sehr geschätzt werden. Danke.

+2

Sie sollten nach, was Sie versucht haben, und wie funktioniert es nicht –

Antwort

0

wie diese versuchen,

allUsersSeen = [ 
 
     {_id: '12csdf', lastSeen: 212512}, 
 
     {_id: '232csdf', lastSeen: 34345}, 
 
     {_id: '1253csdf', lastSeen: 6346453}, 
 
     {_id: '772csfddf', lastSeen: 2345345} 
 
    ]; 
 

 
    currentUsersSeen = [ 
 
     {_id: '12csdf', lastSeen: Date.now()}, 
 
     {_id: '1253csdf', lastSeen: Date.now()}, 
 
     {_id: '1fsdf', lastSeen: Date.now()} 
 
    ]; 
 

 
    function merge(a, b, prop){ 
 
     var reduced = a.filter(a_item => ! b.find (b_item => a_item[prop] === b_item[prop])) 
 
     return reduced.concat(b); 
 
    } 
 
    console.log(merge(allUsersSeen, currentUsersSeen, "_id"));

+0

@ Daniel, ist, dass für u gearbeitet? –

+0

Ja, das war perfekt. Vielen Dank! – Daniel

0

Vielleicht möchten Sie etwas wie das

allUsersSeen = [ 
    {_id: '12csdf', lastSeen: 212512}, 
    {_id: '232csdf', lastSeen: 34345}, 
    {_id: '1253csdf', lastSeen: 6346453}, 
    {_id: '772csfddf', lastSeen: 2345345} 
] 

currentUsersSeen = [ 
    {_id: '12csdf', lastSeen: Date.now()}, 
    {_id: '1253csdf', lastSeen: Date.now()}, 
    {_id: '1fsdf', lastSeen: Date.now()} 
] 

let newArr = allUsersSeen.map(user => currentUsersSeen.find(curr_user => curr_user._id === user._id) || user); 
0

Wenn Sie verstehen, was Sie versuchen, zu tun, können Sie erreichen, dass durch so ziemlich das Element aus allUsersSeen entfernen (falls vorhanden) zuerst und dann erneut hinzufügen von currentUser.

allUsersSeen = [ 
 
    {_id: '12csdf', lastSeen: 212512}, 
 
    {_id: '232csdf', lastSeen: 34345}, 
 
    {_id: '1253csdf', lastSeen: 6346453}, 
 
    {_id: '772csfddf', lastSeen: 2345345} 
 
] 
 

 
currentUsersSeen = [ 
 
    {_id: '12csdf', lastSeen: Date.now()}, 
 
    {_id: '1253csdf', lastSeen: Date.now()}, 
 
    {_id: '1fsdf', lastSeen: Date.now()} 
 
] 
 

 
currentUsersSeen.forEach(user => { 
 
    allUsersSeen = allUsersSeen.filter(obj => obj._id != user.id) 
 
    allUsersSeen.push(user) 
 
})

0

Sie können array#concat sowohl die Arrays und dann array#reduce verwenden, um die lastSeen zu aktualisieren.

var allUsersSeen = [{_id: '12csdf', lastSeen: 212512},{_id: '232csdf', lastSeen: 34345},{_id: '1253csdf', lastSeen: 6346453},{_id: '772csfddf', lastSeen: 2345345}], 
 
    currentUsersSeen = [{_id: '12csdf', lastSeen: Date.now()},{_id: '1253csdf', lastSeen: Date.now()},{_id: '1fsdf', lastSeen: Date.now()}], 
 
    
 
    result = Object.values(allUsersSeen.concat(currentUsersSeen).reduce((r, {_id, lastSeen}) => { 
 
     r[_id] = r[_id] ? {...r[_id], lastSeen} : {_id, lastSeen}; 
 
     return r; 
 
    },{})); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Verwandte Themen