2017-01-22 159 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

在这种情况下的深度比较不是正确的处理方式。如果工作机会的所有者只会改变描述,该怎么办?该项目将返回差异。即使没有真正改变的状态。 –