簡體   English   中英

比較一組對象中的對象

[英]Compare objects in one array of objects

服務器給我下一個數組:

let reportsInDB = [
  {comment:"asdasd", date:"13-02-2018", issueId:"1005"},
  {comment:"asdasd", date:"14-02-2018", issueId:"1005"},
  {comment:"asdasd", date:"15-02-2018", issueId:"1005"},
  {comment:"qwe", date:"13-02-2018", issueId:"1006"},
  {comment:"asd123123asd", date:"14-02-2018", issueId:"1006"},
  {comment:"asd123123asd", date:"15-02-2018", issueId:"1006"},
  {comment:"lalala", date:"15-02-2018", issueId:"1007"},
]

有沒有辦法做下一個:

比較具有今天日期的對象是否具有與“昨天”對象相同的注釋(當然,該對象具有相同的issueId),然后將其推送(也許不推送整個對象,只是推送issueId)到新數組,例如arrRisk = [],但是如果評論連續3天相同-例如,推送到另一個數組arrIncident = []。

因此,最終輸出應類似於以下內容:

arrRisk = ["1006"]
arrIncident = ["1005]

帶有issueId 1007的對象不應轉到任何新數組,因為昨天或前天沒有與它的issueId相同的注釋。

我也得到了服務變量,應該有助於比較:

today = "15-02-2018"
yesterday = "14-02-2018"
beforeYesterday = "13-02-2018"

我在嘗試類似

reportsInDB.map(x => {
    reportsInDB.map(r =>{
    if( x.date === today && 
        r.date === yesterday && 
        x.issueId === r.issueId && 
        x.comment === r.comment
    ){
        reportsToRisk.push(r)
    } 
  })
})

但是輸出完全不是我所需要的(例如,我不需要issueId 1005推送到riskArray),而且三重循環的效果也不如我所知...

那就是我在jsfiddle中嘗試的

希望我的解釋是明確的最終結果。

來自服務器的排序方式: 在此處輸入圖片說明

您需要注意,對其他問題的相同評論不會起作用。 這是一個解決方案,該解決方案首先按問題對數據進行分組,然后針對每個問題收集評論。 然后很簡單。 這也不依賴特定的排序順序:

 const reportsToRisk = []; const reportsToIncident = []; const tdy = moment().format('DD-MM-YYYY'); const yst = moment().subtract(1, 'day').format('DD-MM-YYYY'); const dby = moment().subtract(2, 'day').format('DD-MM-YYYY'); const reportsInDB = [ {comment:"asdasd", date: dby, issueId:"1005"}, {comment:"asdasd", date: yst, issueId:"1005"}, {comment:"asdasd", date: tdy, issueId:"1005"}, {comment:"qwe", date: dby, issueId:"1006"}, {comment:"asd123123asd", date: yst, issueId:"1006"}, {comment:"asd123123asd", date: tdy, issueId:"1006"}, {comment:"123d", date: tdy, issueId:"1007"}, ]; // create a map keyed by issueId: const map = new Map(reportsInDB.map( report => [report.issueId, {}] )); // Fill the date / comment pairs for (const report of reportsInDB) { map.set(report.issueId, Object.assign(map.get(report.issueId), { [report.date]: report.comment })); } for (const [issueId, comments] of map.entries()) { if (comments[tdy] === comments[yst]) { if (comments[tdy] === comments[dby]) { reportsToIncident.push(issueId); } else { reportsToRisk.push(issueId); } } } //console.log("reportsInDB", reportsInDB) console.log('reportsToRisk', reportsToRisk) console.log('reportsToIncident', reportsToIncident) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.0/moment.min.js"></script> 

使用.reduce可以與上一個條目重復比較。 注意,我使用reportsInDB.slice(1)作為我的陣列,我.reduce 。那使得可變respostInDB[idx]總是指向數組中的先前條目。

之后,運行循環以檢查該新陣列中的重復序列。 重復表示您連續有2個事件。

之后,我必須.filter刪除arrRisk中也存在於arrIncident

 let reportsInDB = [ {comment:"asdassd", date:"13-02-2018", issueId:"1005"}, {comment:"asdasd", date:"14-02-2018", issueId:"1005"}, {comment:"asdasd", date:"15-02-2018", issueId:"1005"}, {comment:"qwe", date:"13-02-2018", issueId:"1006"}, {comment:"asd123123asd", date:"14-02-2018", issueId:"1006"}, {comment:"asd123123asd", date:"15-02-2018", issueId:"1006"}, {comment:"lalala", date:"14-02-2018", issueId:"1007"}, {comment:"lalala", date:"15-02-2018", issueId:"1007"}, {comment:"lalala", date:"15-02-2018", issueId:"1007"} ] const matches = reportsInDB.slice(1).reduce((acc, obj, idx) => { if (reportsInDB[idx].comment === obj.comment) { return acc.concat([obj.issueId]) } else { return acc } }, []) let arrRisk = [] let arrIncident = [] for (let i = 0; i < matches.length; i++) { if (matches[i + 1] === matches[i]) { arrIncident.push(matches[i]) } else { arrRisk.push(matches[i]) } } arrRisk = arrRisk.filter((id) => !arrIncident.includes(id)) const issues = {arrRisk, arrIncident} console.log(issues) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM