【问题标题】:Can not add key dynamically in Javascript Object无法在 Javascript 对象中动态添加键
【发布时间】:2015-11-30 21:38:54
【问题描述】:

我正在尝试向 obj 动态添加键,但我不断收到错误“无法设置未定义的属性” 但我不能在知道它们之前对这些属性进行标记。我希望将它们动态添加为该对象的键。

var dict = {}
 objectarray.forEach((item: Obj) => {
        this.dict[item.ID] = "xyz";
    });

根据How do I add a property to a Javascript Object using a variable as the name?,似乎可以通过使用 obj[name] = value 动态地将属性添加到对象。

我错过了什么吗?有什么帮助吗?

【问题讨论】:

  • 问题不是你不能设置这样的属性,问题是你试图设置一个“未定义”的属性。 this.dict 没有定义

标签: javascript typescript


【解决方案1】:

删除this.dict中的this,你应该是金子了!

var dict = {}
objectarray.forEach((item: Obj) => {
   dict[item.ID] = "xyz";
});

如果没有看到更多代码,很难说出this 在这种情况下的含义,但很可能是窗口对象,所以你所说的基本上是window.dict[item.ID] = "xyz"。由于窗口上没有dict 属性,它会像那样爆炸。

【讨论】:

    【解决方案2】:

    @Oskar 的回答是正确的。

    这是一个更详细的代码示例;

    enum memberTypes
    {
        None,
        Property,
        Method
    }
    
    class memberInfo {
        memberName: string;
        memberType: memberTypes;
        constructor(name: string, mtype: memberTypes)
        {
            this.memberName = name;
            this.memberType = mtype;
        }   
        toString() {
            return JSON.stringify(this);
        }
    }
    
    class propertyInfo extends memberInfo
    {
        constructor(name: string) 
        {       
            super(name, memberTypes.Property);
        }   
    }
    
    class methodInfo extends memberInfo
    {
        constructor(name: string) 
        {       
            super(name, memberTypes.Method);
        }   
    }
    
    var dict = new Object();
    var objectArray = new Array<memberInfo>();
    
    objectArray.push(new propertyInfo("Name"), new methodInfo("toString"));
    
    objectArray.forEach((item) => { 
        if (item.memberType === memberTypes.Property)
        {
            if (item.memberName === "Name") {
                dict[item.memberName] = 'SysName';
            }       
        } else if (item.memberType === memberTypes.Method) {
    
            if (item.memberName === "toString") {
                dict[item.memberName] = function() { return JSON.stringify(this); };
            }
        }   
        console.log(item.toString());
    })
    
    console.log(dict);
    

    TypeScript Playground Example

    【讨论】:

    • 更新了,我最初声明dictArray&lt;string&gt;,考虑到这里的整体意图,这是非常不合适的......
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多