如何合并两个Greenhouse API返回的JSON并去重内部Job对象?
基于Greenhouse API职位数据的去重实现方法
我正在使用Greenhouse API获取两个JSON接口的职位数据,每个接口返回的结构都包含department对象,department内部又包含job对象。已经通过getJSON函数获取并合并了数据,现在需要对内部的job对象做去重操作。
原代码如下:
var getJSON = function (url, callback) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "json"; xhr.onload = function () { var status = xhr.status; if (status === 200) { callback(null, xhr.response); } else { callback(status, xhr.response); } }; xhr.send(); }; var mergeJobBoard = []; getJSON("https://boards-api.greenhouse.io/v1/boards/frequenceinc/departments/", function (error, data) { data.departments.forEach((department) => { mergeJobBoard.push(department); }); }); getJSON("https://boards-api.greenhouse.io/v1/boards/frequence/departments/", function (error, data) { data.departments.forEach((department) => { mergeJobBoard.push(department); }); mergeJobBoard.forEach((department) => { if (department.jobs.length > 0) { console.log(department); } }); });
去重实现方案
可以利用Set存储已出现的job唯一标识(比如job的id字段,这是Greenhouse API中job的唯一标识),遍历每个department的jobs数组过滤重复项。同时要注意,两个API请求是异步的,原代码中直接在第二个请求回调里处理合并数据,可能会因为第一个请求未完成导致数据不完整,所以要确保两个请求都完成后再执行去重逻辑。
修改后的代码如下:
var getJSON = function (url, callback) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "json"; xhr.onload = function () { var status = xhr.status; if (status === 200) { callback(null, xhr.response); } else { callback(status, xhr.response); } }; xhr.send(); }; var mergeJobBoard = []; // 计数器确保两个请求都完成再处理数据 var requestCount = 0; function processJobs() { if (requestCount < 2) return; const jobIdSet = new Set(); // 遍历每个部门去重jobs mergeJobBoard.forEach(department => { if (department.jobs && department.jobs.length > 0) { department.jobs = department.jobs.filter(job => { if (jobIdSet.has(job.id)) { return false; } jobIdSet.add(job.id); return true; }); } }); // 输出去重后的结果 mergeJobBoard.forEach((department) => { if (department.jobs.length > 0) { console.log(department); } }); } getJSON("https://boards-api.greenhouse.io/v1/boards/frequenceinc/departments/", function (error, data) { if (!error) { data.departments.forEach((department) => { mergeJobBoard.push(department); }); } requestCount++; processJobs(); }); getJSON("https://boards-api.greenhouse.io/v1/boards/frequence/departments/", function (error, data) { if (!error) { data.departments.forEach((department) => { mergeJobBoard.push(department); }); } requestCount++; processJobs(); });
逻辑说明
- 异步请求处理:添加
requestCount计数器,确保两个API请求都完成后才执行去重和数据处理逻辑,避免因异步特性导致的数据不完整问题。 - job去重:使用
Set存储已处理过的job的id,遍历每个department的jobs数组时,通过filter方法保留未在Set中出现过的job,同时将该job的id存入Set,实现精准去重。
内容的提问来源于stack exchange,提问作者Never Stop Learning
相关产品推荐
相关产品推荐

