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

JavaScript中如何将多个函数传入的对象收集至同一数组?

解决对象累积到同一数组的问题

问题根源在于objCollect是在PlaceData函数内部声明的,每次调用该函数都会重新初始化一个空数组,所以只能保存当前传入的对象。以下是几种可行的解决方案:

方案一:将数组放在共享作用域中

把数组声明在两个函数都能访问的作用域(比如全局作用域),避免每次调用PlaceData都重新创建数组:

// 声明在全局作用域或两个函数的父作用域中
var objCollect = [];

function GetData(query) {
    var json = "";
    var api_url = ('https://jsondata.site?conn={conn}&query={query}');
    // 修正AJAX配置里的分号为逗号
    $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){
        json = JSON.parse(data);
    });
    PlaceData(json);
};

function PlaceData(data) {
    objCollect.push(data);
    console.log(objCollect);
};

方案二:用闭包封装数组

通过闭包将数组私有化,避免污染全局作用域:

// 用立即执行函数创建闭包,保存数组状态
var PlaceData = (function() {
    var objCollect = [];
    return function(data) {
        objCollect.push(data);
        console.log(objCollect);
    }
})();

function GetData(query) {
    var json = "";
    var api_url = ('https://jsondata.site?conn={conn}&query={query}');
    $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){
        json = JSON.parse(data);
    });
    PlaceData(json);
};

方案三:将数组作为函数属性

把数组挂载到PlaceData函数本身作为属性,既不会污染全局,又能保持状态:

function GetData(query) {
    var json = "";
    var api_url = ('https://jsondata.site?conn={conn}&query={query}');
    $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){
        json = JSON.parse(data);
    });
    PlaceData(json);
};

function PlaceData(data) {
    // 仅在第一次调用时初始化数组
    if (!PlaceData.objCollect) {
        PlaceData.objCollect = [];
    }
    PlaceData.objCollect.push(data);
    console.log(PlaceData.objCollect);
};

注意:原代码中AJAX配置的async: false后面使用了分号,这会导致语法错误,上述方案中已修正为逗号。

内容的提问来源于stack exchange,提问作者E0132630

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:37