如何比较对象数组以查找丢失的对象

时间:2017-01-22 20:53:30

标签: javascript arrays json node.js

我可能会说这一切都错了,所以欢迎任何更正。

我在Node中创建了一个Web抓取工具,它从我们组织的网站上删除了一系列作业,将它们存储为一个对象数组,然后将该数组与作为字符串化对象数组存储的前一个scrape进行比较。一个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"
    }
]

3 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情http://underscorejs.org/#difference

但我不确定此函数是否适用于对象数组。 如果不是,您可以使用Array.prototype.filter过滤您的json对象,然后比较ID

答案 1 :(得分:0)

您可以使用lodash isEqual()在对象之间进行深度比较。

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

如果你需要确切地知道哪些键是不同的,你需要遍历一个键的键并与另一个键进行比较,你也可以使用isEqual()。在这种情况下,我首先使用isEqual来比较对象,看它们是否相等。如果不相等,则循环键以找到哪些不是。

答案 2 :(得分:0)

lodash#some可能会帮助你。

  

检查谓词是否为任何集合元素返回truthy。一旦谓词返回truthy,迭代就会停止。

假设有 sample-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};

sample-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"
  }
]