【问题标题】:How to compare array of objects to find missing objects如何比较对象数组以查找丢失的对象
【发布时间】:2017-01-23 07:43:48
【问题描述】:

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

我在 Node 中创建了一个网络爬虫,它从我们组织的网站上爬取作业列表,将它们存储为对象数组,然后将该数组与之前存储为 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"
    }
]

【问题讨论】:

  • 你期望的结果应该如何?
  • 我猜想一个包含所有新对象和已删除对象(作业)的新数组,其新属性将每个对象标识为“新”或“已删除”。我可以从那里拿走。
  • 对于一个数组中的多个元素来说,这需要一周时间。

标签: javascript arrays json node.js


【解决方案1】:

lodash#some 或许能帮到你。

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

假设有 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"
  }
]

【讨论】:

  • 这正是我想要的。非常感谢!
【解决方案2】:

你可以试试http://underscorejs.org/#difference

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

【讨论】:

  • 我试过了,如果你将 .filter() 更改为 .map() 来查找 ID,然后使用下划线的 .difference() 就可以了!我接受了@mə'SHēn 的答案,因为它更完整并且处理了示例中的所有内容。非常感谢您回复并向我展示 underscorejs!
【解决方案3】:

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

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

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

【讨论】:

  • 在这种情况下进行深度比较不是正确的方法。如果工作机会的所有者只更改描述怎么办?该项目将返回差异。状态,即使没有真正改变。
猜你喜欢
  • 2023-01-05
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多