Javascript 帮助向对象文字添加新属性

Javascript 帮助向对象文字添加新属性,javascript,json,object-literal,Javascript,Json,Object Literal,为什么会出现这种情况: tracker.paramsToTrack未定义 var tracker = {}; var paramsToTrack = ['a', 'b', 'c', 'd', 'e']; for (p in paramsToTrack) { if(params[paramsToTrack[p]]) { tracker.paramsToTrack[p] = params[paramsToTrack[p]]; } } console.log(

为什么会出现这种情况: tracker.paramsToTrack未定义

var tracker = {};
var paramsToTrack = ['a', 'b', 'c', 'd', 'e'];
for (p in paramsToTrack)
{
    if(params[paramsToTrack[p]])
    {
        tracker.paramsToTrack[p] = params[paramsToTrack[p]];
    }

}
console.log(tracker);
我基本上是在检查参数“a”到“e”是否存在。如果是,请将它们添加到跟踪器对象,如下所示:

tracker.a=东西

tracker.b=东西

想想我做错了什么

tracker.paramsToTrack[p]
应该是

tracker[paramsToTrack[p]]
此外,您可能希望消除冗余阵列查找,这并非您所要求的:

var tracker = {};
var paramsToTrack = ['a', 'b', 'c', 'd', 'e'];
var paramName;
for (p in paramsToTrack)
{
    paramName = paramsToTrack[p];
    if(params[paramName])
    {
        tracker[paramName] = params[paramName];
    }

}
console.log(tracker);
如果您在现代Javascript环境中工作,则更好:

paramsToTrack.forEach(function (paramName) {
    if(params[paramName])
    {
        tracker[paramName] = params[paramName];
    }
});

点表示法按字面意思处理属性名称。您本质上是在请求tracker的“paramsToTrack”属性。实际上,您想要的是对表达式paramsToTrack[p]求值,然后将结果视为属性名称。@Joshua McGinnis:以下两种符号是等效的:
obj['property']
obj.property
。您只能使用前一种符号的变量。@Bobby。再次感谢。你能解释一下“现代Javascript环境”是什么意思,并解释一下你的替代方法在高层次上做了什么吗?ECMAScript的最新版本(我们称之为Javascript)是第5版,除此之外,它还正式为数组引入了forEach函数。退房这只是一种更简洁的方法来迭代数组的值。这样,您就不必创建数组索引变量(在本例中为p)——您可以直接使用数组元素。由于它是ECMAScript的最新版本,因此并非所有浏览器都支持它,因此是一个现代Javascript环境。