首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问动态创建的对象。js

访问动态创建的对象。js
EN

Stack Overflow用户
提问于 2017-01-04 13:06:01
回答 2查看 55关注 0票数 0

我无法访问在循环中创建的对象。

代码语言:javascript
复制
// global var $subtypes //

...
... code ...
...

$subtypes = {};

for ( var $cols = 0; $cols < $subtypecols.length; $cols++ ) // Here i can got from 1 to 20 
{
    var columnName = 'column' + $cols; // column0, column1, column2 ... column20
    $subtypes.columnName = {  };  // creating empty object

    for ( var $rows = 0; $rows < $subtypeTableRows.length; $rows++ ) // from 1 to 10.
    {
        var rowNumber = 'row' + $rows; // row1, row2, row3 ... row7
        $subtypes.columnName.rowNumber = { 'count' : -1, 'price' : -1 };
    };
};
//console.log ( 'l ' +  $subtypes['column3']['row5'] ); //undefined is not an object (evaluating '$subtypes['column3']['row5']')
//console.log ( 'l ' +  $subtypes['column3']['row5'].count ); //undefined is not an object (evaluating '$subtypes['column3']['row5']')
//console.log ( 'l ' +  $subtypes[column3][row5].count ); //ReferenceError: Can't find variable: column3
//console.log ( 'l ' +  $subtypes[column3][row5] ); //ReferenceError: Can't find variable: column3
//console.log ( 'l ' +  $subtypes.column3.row5 ); //expected 'object', got: undefined is not an object (evaluating '$subtypes.column4.row2')

我做错了什么?

UPD 1:代码不起作用..。

代码语言:javascript
复制
for (var o = 0; o < 5; o++)
{
    var $prevNum = 'prev' + o;
    var $prevTxt = $nodelist[o].textContent

    $itemConfig = {     $itemWithPreviews : { $prevNum : $prevTxt }     }; 
    // i got string name '$prevNum' : and value from valiable $prevTxt.

    $itemConfig = {     $itemWithPreviews : { [$prevNum] : $prevTxt }   }; 
    // JS script can't start
};

UPD 2:

代码语言:javascript
复制
var $root = {};
var $root[0] = {}; // data
var $root[1] = {}; // another data
var $root[2] = {}; // here will be stored buttons and rows.. 

for ( var $buttons = 0; $buttons < 10; $buttons++ ) // 10 buttons
{
    var buttonName = 'button' + $buttons; // button0, button1, button2 ... buttom9

    var objButton = { };
    objButton[buttonName] = { }; 
    $root[2].push( objButton ); //here all's ok: { "button0":{} }, { "button1":{} } ... 


    for ( var $row = 0; $row < 5; $row++ )
    {
        var rowNumber = 'row' + $row; // row0, row2 ... row4


        var objRow = { };
        objRow[rowNumber] = { }; 

        $root[2][buttonName].push ( objRow ); 
        // Expect.: { "button0": { "row0": { }, "row1": { }, "row2": { }, ...  } }, { "button1": { "row0": { }, "row1": { }, "row2": { }, ...  } } ... 
        // Got: ERROR: TypeError: undefined is not an object (evaluating '$root[2][buttonName].push')

        //same situation...
        $root[2][$buttons].push ( objRow );
        // Got: ERROR: TypeError: undefined is not a function (evaluating '$root[2][$buttons].push ( objRow )')

    };
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 13:13:12

你做了:

代码语言:javascript
复制
$subtypes.columnName = {  };
$subtypes.columnName.rowNumber = { 'count' : -1, 'price' : -1 };

它创建了以下对象:

代码语言:javascript
复制
$subtypes["columnName"]["rowNumber"];

如果要创建$subtypes['column3']['row5'],则需要执行以下操作:

代码语言:javascript
复制
$subtypes[columnName] = {  };
$subtypes[columnName][rowNumber] = { 'count' : -1, 'price' : -1 };

记住,点表示法a.b.c等同于a['b']['c']。因此,您的console.log()也可以编写为:

代码语言:javascript
复制
console.log ( 'l ' +  $subtypes.column3.row5 );

更新:

至于你的后续问题,当你问的时候

代码语言:javascript
复制
$itemConfig = {$itemWithPreviews : { $prevNum : $prevTxt }}; 

您正在创建以下对象:

代码语言:javascript
复制
$itemConfig["$itemWithPreviews"]["$prevNum"] = $prevTxt;

属性名是,而不是变量。它们总是被解释为文字字符串。因此,$prevNum"$prevNum",而不是"prev0"等。另一方面,属性值是变量,因此$prevTxt具有相同的值。

ES6 (也称为ES2015)引入了一种新的语法调用计算属性名称,允许您做您想做的事情。用于这样做的语法使用了熟悉的方括号:

代码语言:javascript
复制
$itemConfig = {[$itemWithPreviews] : {[$prevNum] : $prevTxt }};

然而,截至2017年1月,只有Chrome、Firefox和Node.js支持这种语法。这在其他浏览器中是行不通的,所以您必须采用老式的方式:

代码语言:javascript
复制
$itemConfig = {};
$itemConfig[$itemWithPreviews] = {};
$itemConfig[$itemWithPreviews][$prevNum] = $prevTxt;

如果要在循环中这样做,可以有条件地初始化属性:

代码语言:javascript
复制
$itemConfig = {};

for (var o = 0; o < 5; o++) {
    var $prevNum = 'prev' + o;
    var $prevTxt = $nodelist[o].textContent;

    if ($itemConfig[$itemWithPreviews] === undefined) {
        $itemConfig[$itemWithPreviews] = {};
    }

    if ($itemConfig[$itemWithPreviews][$prevNum] === undefined) {
        $itemConfig[$itemWithPreviews][$prevNum] = {};
    }

    $itemConfig[$itemWithPreviews][$prevNum] = $prevTxt;
}
票数 2
EN

Stack Overflow用户

发布于 2017-01-04 13:10:17

$subtypes.columnName将创建文字columnName属性。使用[]使用动态命名:

代码语言:javascript
复制
$subtypes = {};

for (var $cols = 0; $cols < 5; $cols++) {
  var columnName = 'column' + $cols;
  $subtypes[columnName] = {};

  for (var $rows = 0; $rows < 6; $rows++) {
    $subtypes[columnName]['row' + $rows] = {'count': -1, 'price': -1};
  };
};

console.log($subtypes);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41464578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档