2016-08-09 57 views
0

所以考慮以下數據:給我說有相同的日期陣列中的所有元素,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" 
     }, 
     ... 
    ] 
} 

將如何得到我得到相匹配的所有元素:2016年8月8日?

你有什麼試過?

Lodashes,過濾器:

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

我不關心什麼時候他們在,只是只要他們在比賽中創造了一天創建的一天。

有幫助嗎?

更新

我才意識到,我也要去這一切錯誤的,因爲雖然我只顯示你的數據的一部分,有數以百計的這些對象我的數組(如果不是數千名),目標是說,確定2016-08-08有16場比賽,x場比賽50場比賽,y場比賽14場比賽,這增加了這個過濾器的複雜性。

+0

等待,你在'filter'回調有一個條件 - 是不是真的想兩邊相比,得到完全相同的日期? – vlaz

+1

這很容易,他們都匹配,所以只是得到所有? – adeneo

+0

@vld我不明白你的問題。我只想從數組中獲取與指定格式的日期匹配的所有元素。目前數組返回時是空的。 – TheWebs

回答

2

我覺得GROUPBY是基於您的更新更好的選擇:

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>

你得到數組的對象從另一端

+0

看到這是正確的答案,但它不適用於我,this.state。 data.post_views'包含一個對象數組。而'groupedDatesThatMatch'只是一個空對象。 – TheWebs

+0

我看到的唯一奇特就是你沒有在你的樣本中引用lodash,而是'過濾'。你確定你已經申報了。之後,你將不得不拋出一個調試器;或console.log來查看該函數試圖過濾的數據。 – dmoo

+0

這是我的結局導入錯誤>。> – TheWebs

0

你可以建立一個「反向查找表「(即,指示每個鍵發生的位置) 以下是樣例演示;

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

......怎麼

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

一些finagling後,我設法拿出一個使用的日期格式,並允許您自定義的日期上飛解決方案容易。這不使用庫和直接ES6。如果您運行該代碼段,則會看到日期匹配並存儲。

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

相關問題