2017-01-22 90 views
0

我可能會對此做所有錯誤的處理,因此歡迎任何更正。如何比較對象數組以找到丟失的對象

我在Node中創建了一個網頁抓取工具,將我的org網站上的作業清單刪除,將它們存儲爲一個對象數組,然後將該數組與之前存儲爲JSON文件中的對象的字符串化數組。當使用存儲數組時,我使用JSON.parse(),所以比較是針對對象的對象。我的最終目標是通過電子郵件發送哪些作業實時添加和刪除,因此我需要找出陣列之間的差異。

我被困在如何找到差異。我的數組結構如下。

我一直在閱讀,沒有深入的比較是不可能準確地比較對象的數組,但我不知道還有什麼要做(我的知識在這裏很薄弱)。像這樣的事情是正確的道路? Compare array of objects to array of ids

[ 
    { 
     job_id: "xxxxx", 
     title: "Job 1", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    }, 
    { 
     job_id: "xxxxx", 
     title: "Job 2", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    } 
] 
+1

應該是什麼樣子的結果,你期待什麼呢? –

+0

我猜想一個新的數組的所有新的和刪除的對象(作業)與一個新的屬性,標識每個對象爲「新」或「刪除」。我可以從那裏拿走它。 – tomster2300

+0

對於一個數組中的多個元素,它有點周。 –

回答

0

lodash#some也許可以幫助你。

檢查謂詞是否返回任何集合元素的真值。一旦謂詞返回真,迭代就會停止。

假設有樣品t1.js

var jobsT1 = [ 
    { 
     job_id: "1", 
     title: "Job 1", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    }, 
    { 
     job_id: "2", 
     title: "Job 2", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    } 
]; 

module.exports = {jobsT1}; 

樣品t2.js

var jobsT2 = [ 
    { 
     job_id: "1", 
     title: "Job 1", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    }, 
    { 
     job_id: "3", 
     title: "Job 3", 
     description: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
     department: "Department: Lorem ipsum dolor sit amet", 
     location: "Location: Lorem ipsum dolor sit amet" 
    } 
]; 

module.exports = {jobsT2}; 

使用lodash.some方法兩次,你可以很容易地已瞭解新的和刪除的工作只是匹配他們的ID。

const _ = require('lodash'); 

var {jobsT1} = require('./sample-t1'); 
var {jobsT2} = require('./sample-t2'); 

var newJobs = []; 
var removedJobs = []; 

_.forEach(jobsT2, function (n, key) { 
    if(!_.some(jobsT1, {'job_id': n.job_id})) { 
    newJobs.push(n); 
    } 
}); 

_.forEach(jobsT1, function (n, key) { 
    if(!_.some(jobsT2, {'job_id': n.job_id})) { 
    removedJobs.push(n); 
    } 
}); 

console.log('New jobs:', JSON.stringify(newJobs, undefined, 2)); 
console.log('========'); 
console.log('Removed jobs:', JSON.stringify(removedJobs, undefined, 2)); 

有了這樣的結果:

New jobs: [ 
    { 
    "job_id": "3", 
    "title": "Job 3", 
    "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
    "department": "Department: Lorem ipsum dolor sit amet", 
    "location": "Location: Lorem ipsum dolor sit amet" 
    } 
] 
======== 
Removed jobs: [ 
    { 
    "job_id": "2", 
    "title": "Job 2", 
    "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 
    "department": "Department: Lorem ipsum dolor sit amet", 
    "location": "Location: Lorem ipsum dolor sit amet" 
    } 
] 
+0

這正是我所期待的。非常感謝! – tomster2300

0

,你可以嘗試這樣的事情http://underscorejs.org/#difference

,但我真的不知道這函數對象數組工程。 如果沒有,您可以使用Array.prototype.filter過濾您的json對象,然後比較ID

+0

我試過這個,如果你改變.filter()爲.map()來查找ID,然後使用下劃線的.difference(),那麼這個工程!我接受了@mə'SHēn的回答,因爲它比較完整,並處理了例子中的所有內容。非常感謝您回覆並向我展示underscorejs! – tomster2300

0

您可以使用lodash isEqual()在對象之間進行深入比較。

https://lodash.com/docs/4.17.4#isEqual

如果您需要確切地知道哪些鍵是不同的,你需要遍歷一個的鑰匙,並與其他的,你也可以使用的isEqual()進行比較。在這種情況下,我首先使用isEqual來比較對象以查看它們是否相等。如果不相等,然後通過鍵循環找到哪些不是。

+0

在這種情況下的深度比較不是正確的處理方式。如果工作機會的所有者只會改變描述,該怎麼辦?該項目將返回差異。即使沒有真正改變的狀態。 –