Javascript在对象内通过字符串引用变量名

Javascript referencing variable name by string within object

本文关键字:字符串 引用 变量名 对象 Javascript      更新时间:2023-09-26

我正在用JavaScript制作一个音乐作曲程序,最近我遇到了一个问题,我需要尽可能快地迭代我的数据。我有一个位JSON对象song它的设置是这样的

歌= {" track0":"数据…","track1":"数据 ...", ...};

我想知道如果我生病几个函数到歌曲JSON对象。如何从track0迭代到trackn?我知道我可以做像song["track"+ n]这样的事情,但这就是我现在正在做的,我的目标是将我的函数移动到song JSON对象中,这样我就可以更快地迭代…或者,如果我只是把函数移到对象中,就不会有任何性能上的提高吗?

根据定义,JSON不能包含函数,只能包含数据。

如果您能够修改数据结构,请考虑使用曲目数组,而不是像您那样使用。例如:

song = {"tracks":["data...", "data...", ...], ...};

@Muggy Ate

如何从track0迭代到trackn?我知道我可以做像song["track"+ n]这样的事情,但这就是我现在正在做的,我的目标是将我的函数移动到song JSON对象中,这样我就可以更快地迭代…或者,如果我只是把函数移到对象中,就不会有任何性能上的提高吗?

有很多方法可以做到这一点。我只提出一种方法。你只能有一个函数来执行你所需要的,这个函数只能在你需要的对象的上下文中运行。同样,通过注入上下文,你可以在其他对象中创建对该函数的引用,例如:

function iterator (criteria) {
    var obj = this,
        prop;
    for (prop in obj) {
        //TODO: Add what you need to do in each iteration
        if (obj[prop] == criteria) { return prop; }
    }
}
//mockups
var song1 = { "track0": "data0", "track1": "data1" },
    song2 = { "track0": "data0", "track1": "data1" };
//iterates over song1 object,
//for this case, we look for the property that has the value "data0"
var something = iterator.call(song1, 'data0');
//something = "track0"

另一个优点是您还可以使用原型继承创建对象。

如果您想通过添加方法来扩展您的对象,您可以这样做,正如我们在前面的示例中看到的那样,我们在iterator函数中使用this,这给我们提供了处理不同对象的优势

//extends obj by attaching new methods
//and binding the execution context of the methods
function addMethods(obj) {
    obj.iterator = iterator.bind(obj);
}
addMethods(song1);
addMethods(song2);
//we use the "iterator" method extended inside song2
something = song2.iterator('data1');
//something = "track1"

所以您需要一个对象来存储您的函数。假设您想要创建一些实用函数。

var utils = {};

现在可以有

utils.function1 = function() {
    //function1 body here 
};
utils.function2 = function() {
    //function2 body here 
};
utils.function3 = function() {
    //function3 body here 
};

从代码组织的角度来看,这是更好的,但我不认为这将是性能方面的瓶颈。

底线:将函数移到对象中不会获得任何性能增益。