JavaScript 带有函数参数的动态命名

JavaScript Dynamic naming with argument of function.

本文关键字:动态 参数 函数 JavaScript      更新时间:2023-09-26

我一直在寻找答案,但徒劳无功。

我有一个函数,它将表名作为参数。 但此名称可以是对象。

loadDataFromServer = function(dataTable) {
 //data fetch code ...
datadump[dataTable] = response.getDataTable();
}
loadDataFromServer(['gchart']['data'])

问题是我需要将数据存储在变量datadump.gchart.data中,但是"gchart.data"部分需要在调用函数时确定,而不是在其中进行硬编码。我的问题是 datadump[['gchart']['data']]datadump['gchart']['data'](与datadump.gchart.data相同)

这里有人知道这样做的好方法吗?如果输入只是gchart_data,这将很容易工作,但函数需要能够处理它,即使它需要将其数据分配给blabla.blibli.bloebloe.stuff

提前致谢

我认为

您要查找的是:

function (result) {
    datadump = {};
    datadump.gchart = {};
    datadump.gchart.data = result.gchart.data;
    // or
    datadump.gchart = {
        data: result.gchart.data
    };    
}

不过,这样有点奇怪。你绝对需要datadump中的gchart吗?

分配给像blabla.blibli.bloebloe.stuff这样的随机深度并不容易。

您可以像这样扁平化:obj["blabla.blibli.bloebloe.stuff"] = {};

或者你可以写一个递归合并,比如:

var a, b, c;
a = { foo: { ipsum: "lorem" } };
b = { bar: {}, foo: { abc: "def" } };
c = recursive_merge(a, b); // { foo: { ipsum: "lorem", abc: "def" }, bar: {} };

让你函数获取字符串列表并迭代它们以递归访问(并在必要时创建)datadump的属性。我在这里使用 arguments 来使用参数列表本身,但您也可以只使用作为字符串数组的单个参数。

var loadDataFromServer = function() {
    var currObj = datadump;
    // iterate over the list of property names
    for(var i=0; i<arguments.length - 1; ++i) {
        var nextName = arguments[i];
        // if the object doesn't have this property, make it
        if(currObj[nextName] == undefined) {
            currObj[nextName] = {};
        }
        // use currObj's property as the new `currObj`
        currObj = currObj[nextName];
    }
    // load data into the final named property
    currObj[arguments[i]] = response.getDataTable();
}
loadDataFromServer('gchart', 'data');