You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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();
});

逻辑说明

  1. 异步请求处理:添加requestCount计数器,确保两个API请求都完成后才执行去重和数据处理逻辑,避免因异步特性导致的数据不完整问题。
  2. job去重:使用Set存储已处理过的job的id,遍历每个department的jobs数组时,通过filter方法保留未在Set中出现过的job,同时将该job的id存入Set,实现精准去重。

内容的提问来源于stack exchange,提问作者Never Stop Learning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:53:00