动态密钥名称

时间:2013-07-18 06:35:35

标签: javascript

我试图通过在元素的初始即公共前缀中传递一个整数来动态生成对象元素。

像这样:

           if(inventory.inventory_obj.length){
                obj.inventory_length = inventory.inventory_obj.length;
                for(var x=0; x < inventory.inventory_obj.length; x++){

                    obj.warehouse_+x = inventory.inventory_obj[x].warehouse;
                    obj.name_+x = inventory.inventory_obj[x].name;
                    obj.space_+x = inventory.inventory_obj[x].space;
                    obj.cost_+x = inventory.inventory_obj[x].cost;
                    obj.quantity_+x = inventory.inventory_obj[x].quantity;
                    obj.level_+x = inventory.inventory_obj[x].level;
                    obj.status_+x = inventory.inventory_obj[x].status;
                    obj.deleted_+x = inventory.inventory_obj[x].deleted;
                }
            }

执行上述操作时出现"Invalid left-hand side in assignment"错误

我已经通过console.log(inventory.inventory_obj)测试了inventory.inventory_obj并验证它是否具有所需的值。

我做过的其他尝试包括

                    obj.warehouse_+""+x = inventory.inventory_obj[x].warehouse;
                    obj.warehouse+"_"+x = inventory.inventory_obj[x].warehouse;
                    obj.warehouse_+x.toString() = inventory.inventory_obj[x].warehouse;
                    obj.warehouse.concat("_"+x+"") = inventory.inventory_obj[x].warehouse;
                    //Eliminating the underscore
                    obj.warehouse+x = inventory.inventory_obj[x].warehouse;

以上所有都失败了。

请有人帮我理解我做错了什么。

3 个答案:

答案 0 :(得分:3)

要动态创建属性名称,请使用方括号:

obj['warehouse_' + x] = nventory.inventory_obj[x].warehouse;

答案 1 :(得分:2)

您的+名称中的obj.warehouse_+x以及所有其他类似的实例都不能包含obj["warehouse_" + x]

您需要使用:obj["warehouse_" + x] = obj["warehouse_" + x] + inventory.inventory_obj[x].warehouse; 作为动态对象键名称。

对于连接,请尝试使用:

{{1}}

对象没有串联运算符,例如字符串或数字(+ =)。

答案 2 :(得分:0)

虽然语言不接受算术名称,除非你实际上是用它来创建一个字符串,但我认为通过使用数组而不是许多同名变量,你将有更好的语义。

例如,如果有许多索引obj.warehouse,则应将其初始化为数组:

obj.warehouse=[];

然后,把东西放进去:

obj.warehouse[x] = inventory.inventory_obj[x].warehouse;

以后访问它会更容易,因为每次要访问仓库时都不必连接。此外,只要有“连接”访问,只要重命名某些内容,调试就会很麻烦。