簡體   English   中英

如何比較對象數組以查找丟失的對象

[英]How to compare array of objects to find missing objects

我可能會犯錯,所以歡迎進行任何更正。

我在Node中創建了一個Web抓取器,該抓取器從組織的網站上抓取了一系列工作,將其存儲為對象數組,然后將該數組與先前存儲為JSON文件中的字符串化對象數組的抓取對象進行比較。 我在獲取存儲的數組時使用JSON.parse() ,因此比較是針對對象的對象。 我的最終目標是通過電子郵件實時發送已添加和刪除的作業,因此我需要找出陣列之間的差異。

我堅持如何找到差異。 我的數組結構如下。

我一直在閱讀,如果不進行深層比較就不可能准確地比較對象數組,但是我不確定還有什么要做的(我的知識很薄弱)。 這樣的事情會是正確的道路嗎? 比較對象數組和ID數組

[
    {
        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"
    }
]

您可以嘗試類似http://underscorejs.org/#difference的方法

但是我不確定該函數是否可以用於對象數組。 如果不是,則可以使用Array.prototype.filter過濾json對象,然后比較ID

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

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

如果您需要確切知道哪些鍵不同,則需要遍歷一個鍵並與另一個鍵進行比較,也可以使用isEqual()進行比較。 在這種情況下,我將首先使用isEqual比較對象以查看它們是否相等。 如果不相等,則遍歷各個鍵以找出不正確的鍵。

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

暫無
暫無

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

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