2016-08-09 1 views
0

folgende Daten So betrachten:Gib mir alle Elemente im Array, das das gleiche Datum haben, JS

{ 
    post_views:[ 
     { 
     id:1, 
     post_id:5, 
     ip_address:"xxx", 
     created_at:"2016-08-08T22:22:45+0000", 
     updated_at:"2016-08-08T22:22:45+0000" 
     }, 
     { 
     id:2, 
     post_id:5, 
     ip_address:"yyy", 
     created_at:"2016-08-08T22:23:00+0000", 
     updated_at:"2016-08-08T22:23:00+0000" 
     }, 
     ... 
    ] 
} 

Wie würden bekomme ich alle Elemente erhalten, die passen: 2016.08.08 ??

Was haben Sie versucht?

Lodashes, Filter:

let datesThatMatch = filter(this.state.data.post_views, (views) => { 
    return moment(views.created_at).format('MMMM Do YYYY') === moment(views.created_at).format('MMMM Do YYYY') 
    }); 

    console.log(datesThatMatch); 

Ich interessiere mich nicht über zu welcher Tageszeit sie an, nur so lange, wie der Tag erstellt wurden sie auf Spiel erstellt wurden.

Hilfe?

aktualisieren

ich nur realisiert Ich bin auch darüber geht alles schief, denn während ich Sie nur einen Teil der Daten zeigte, gibt es Hunderte dieser Objekte sind i das Array (wenn nicht Tausende) und das Ziel ist zu sagen, ok, es gibt 16 Spiele für 2016-08-08, 50 Spiele für x Datum, 14 Treffer für y Datum, was die Komplexität dieses Filters erhöht.

+0

Warten, dass Bedingung, die Sie in dem 'filter' Rückruf haben - versucht, es wirklich genau die gleiche Datum, an beiden Seiten im Vergleich zu bekommen? – vlaz

+1

Das ist einfach, sie passen beide zusammen, also einfach alle? – adeneo

+0

@vld Ich verstehe deine Frage nicht. Ich möchte nur alle Elemente aus dem Array, die mit dem Datum im angegebenen Format übereinstimmen. Momentan ist das Array leer, wenn es zurückkehrt. – TheWebs

Antwort

2

Ich denke groupBy eine bessere Alternative ist auf Ihrem Update basiert:

var data = { 
 
    post_views:[ 
 
     { 
 
     id:1, 
 
     post_id:5, 
 
     ip_address:"xxx", 
 
     created_at:"2016-08-08T22:22:45+0000", 
 
     updated_at:"2016-08-08T22:22:45+0000" 
 
     }, 
 
     { 
 
     id:2, 
 
     post_id:5, 
 
     ip_address:"yyy", 
 
     created_at:"2016-08-08T22:23:00+0000", 
 
     updated_at:"2016-08-08T22:23:00+0000" 
 
     }, 
 
     { 
 
     id:3, 
 
     post_id:5, 
 
     ip_address:"zzz", 
 
     created_at:"2016-08-12T20:15:00+0000", 
 
     updated_at:"2016-08-12T21:20:00+0000" 
 
     }, 
 
    ] 
 
} 
 
     
 
let groupedDatesThatMatch = _.groupBy(data.post_views, function(views) { 
 
    return moment(views.created_at).format('MMMM Do YYYY') 
 
}); 
 
     
 
console.log(groupedDatesThatMatch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.2/lodash.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

Sie erhalten ein Objekt von Arrays aus dem anderen Ende

+0

Das ist die richtige Antwort, aber es funktioniert nicht für mich, den 'this.state. data.post_views' enthält ein Array von Objekten. und das 'groupedDatesThatMatch' ist nur ein leeres Objekt. – TheWebs

+0

Die einzige Kuriosität, die ich gesehen habe, war, dass du nicht auf lodash in deiner Probe Bezug genommen hast, sondern "Filter". Sie haben sicher, dass Sie lodash erklärt haben. Danach müssen Sie einen Debugger einwerfen; oder console.log, um zu sehen, nach welchen Daten die Funktion zu filtern versucht. – dmoo

+0

Es war ein Importfehler an meinem Ende>.> – TheWebs

0

Sie können einen „Reverse-Lookup bauen Tabelle "(zeigt an, wo jeder Schlüssel vorkommt) Es folgt eine Beispieldemo;

var a = [1,1,2,3,4,5,6,6,7];                               
var reverseIndex = new Map(); 
a.every((cVal, i, a) => { 
    var existing = reverseIndex.has(cVal) ? reverseIndex.get(cVal) : []; 
    existing.push(i); 
    reverseIndex.set(cVal, existing); 
    return true; 
}); 

console.log(reverseIndex); 
0

Wie sei es ...

let post_views = [ 
 
     { 
 
     id:1, 
 
     post_id:5, 
 
     ip_address:"xxx", 
 
     created_at:"2016-08-08T22:22:45+0000", 
 
     updated_at:"2016-08-08T22:22:45+0000" 
 
     }, 
 
     { 
 
     id:2, 
 
     post_id:5, 
 
     ip_address:"yyy", 
 
     created_at:"2016-08-08T22:23:00+0000", 
 
     updated_at:"2016-08-08T22:23:00+0000" 
 
     } 
 
    ] 
 
    
 
let looking_for = new RegExp('2016-08-08') 
 
    
 
let result = post_views.filter(view => looking_for.test(view.created_at) || looking_for.test(view.updated_at)) 
 

 
let summary = result.reduce((prev,view) => { 
 
    
 
        let created_at = view.created_at.split('T')[0]; 
 
        let updated_at = view.updated_at.split('T')[0]; 
 
    
 
         prev.created_at[created_at] = prev.created_at[created_at] || 0; 
 
         prev.updated_at[updated_at] = prev.updated_at[updated_at] || 0; 
 
         prev.created_at[created_at]++; 
 
         prev.updated_at[updated_at]++; 
 
    
 
         return prev; 
 
        },{ created_at: {}, updated_at: {} }) 
 

 
console.log(result); 
 

 
console.log(summary);

0

Nach einigem finagling gelang es mir, mit einer Lösung zu kommen, das Datumsformat verwendet und ermöglicht es Ihnen, das Datum, an dem fly anpassen leicht. Dies verwendet keine Bibliotheken und gerade ES6. Wenn Sie das Snippet ausführen, sehen Sie, dass Ihre Daten übereinstimmen und gespeichert sind.

const arr = { 
 
    post_views:[ 
 
     { 
 
     id:1, 
 
     post_id:5, 
 
     ip_address:"xxx", 
 
     created_at:"2016-08-08T22:22:45+0000", 
 
     updated_at:"2016-08-08T22:22:45+0000" 
 
     }, 
 
     { 
 
     id:2, 
 
     post_id:5, 
 
     ip_address:"yyy", 
 
     created_at:"2016-08-08T22:23:00+0000", 
 
     updated_at:"2016-08-08T22:23:00+0000" 
 
     }, 
 
     { 
 
     id:3, 
 
     post_id:5, 
 
     ip_address:"yyy", 
 
     created_at:"2016-08-09T22:23:00+0000", 
 
     updated_at:"2016-08-08T22:23:00+0000" 
 
     }, 
 
    ] 
 
} 
 
const filterDate = new Date(2016, 08, 08); 
 

 
function parseDate(date) { 
 
    const dateString = date.split("T")[0].split('-'); //Get just the date portion, and then split that into an array. 
 
    const newDate = new Date(Number(dateString[0]), Number(dateString[1]), Number(dateString[2])) //Make the new date object 
 
    return newDate; 
 
} 
 

 
let myMatches = arr.post_views.filter(thisDate => parseDate(thisDate.created_at).getTime() == filterDate.getTime()); 
 

 
console.log(myMatches);

Verwandte Themen