Javascript:将数组的名称更改为字符串

时间:2013-05-07 15:41:08

标签: javascript hyperion

下面,我有一组对象数组。我经历了寻找我的对象,一旦我找到了它所在的数组,我想得到并使用该数组的名称作为字符串。我的猜测是类似于Array.name(如下所示),但这不起作用。

ActiveDocument.gaShapesTab1 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape1"],ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape2"]); 
ActiveDocument.gaShapesTab2 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape3"],ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape4"]); 
ActiveDocument.gaShapesTab3 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape5"],ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape6"]); 
ActiveDocument.gaShapeArrays = new Array(gaShapesTab1, gaShapesTab2, gaShapesTab3);

// go through an array of arrays
for(var x=0; x<gaShapeArrays.length; x++)
{ 
    // and go through the objects of each one
    for(var y=0; y<gaShapeArrays[x].length; y++)
    {
        // if "object" is in the array
        if(object == gaShapeArrays[x][y])
        {
            // get "sidetab" from object's array's name
            var sidetab = gaShapeArrays[x].name.replace('gaShapes',''); // assumes that shapearrays will have naming convention gaShapesSidetab
            // we found it, we can stop now
            break;
        }
    }
}

我在Hyperion Intelligence工作,因此并非所有Javascript都适用。例如,我无权访问窗口或文档。

每个数组都包含一组与可视选项卡相关的形状对象。这允许我通过调用形状数组来显示或隐藏或使用每个选项卡上的内容执行更复杂的操作。但是,在处理形状时,我需要知道它们在哪个标签上。我正试图通过找到他们所在的阵列来向后工作。

3 个答案:

答案 0 :(得分:1)

你不想这样做。

如果你真的需要在几个数组中找到一个值然后拉出一个标识符,那么你需要一个字典,而不是命名变量:

var dictOfArrays = {
    'evens': [0,2,4,6,8,10],
    'odds': [1,3,5,7,9]
};

这会将您搜索的标识符存储为数据,因此您可以存储该标识符,并在以后使用它来检索该值:

var whichArrayKey = findMyValuesKey(value, dictOfArrays);
console.log('Value '+value+' is in array keyed '+whichArrayKey);
var matchingArray = dictOfArrays[whichArrayKey];
var firstValueInMatchingArray = matchingArray[0];

变量的名称只是供开发人员用来知道哪个是哪个东西的东西。它只是存储内容的内存中的句柄。因此,它对代码没有任何意义。如果你真的想在程序中使用它,那么它是数据,而不是代码,应该像上面的字典一样编码在数据结构中。这样你就可以随意传递数组或标识符,并且代码的行为不必与你给变量的名称联系起来。

编辑1:

新添加的代码,以字典形式/对象表示法:

ActiveDocument.gaShapeArrays = {
    'gaShapesTab1' : [ 
        ActiveDocument.Sections["Dashboard"].Shapes["Shape1"], 
        ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape2"]
    ], 
    'gaShapesTab2' : [
        ActiveDocument.Sections["Dashboard"].Shapes["Shape3"],
        ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape4"]
    ],
    'gaShapesTab3' : [
        ActiveDocument.Sections["Dashboard"].Shapes["Shape5"],
        ActiveDocument.Secti‌​ons["Dashboard"].Shapes["Shape6"]
    ]
}

因此每个键(例如'gaShapesTab1')都与数组值([ ... ])配对。这不是在任何地方使用new Array()

一旦找到包含与您的对象匹配的引用的数组的键,您就会将该键作为字符串(例如"gaShapesTab3")。你不能就地改变这个字符串,我认为你不想这样做。如果您可以澄清为什么需要更改数组的名称,可能会清楚如何解决问题。例如,您是否有其他需要该数组具有特定名称的代码?

答案 1 :(得分:0)

数组的名字?数组没有名称。您只有变量名称,存储阵列的变量。如果你有一个二维数组,你需要抓住“坐标”。

所以:

if(object == gaShapeArrays[x][y])
{
    // Found the object! It's in [x][y], so in array gaShapeArrays[x] which
    // itself is in gaShapeArrays
}

答案 2 :(得分:0)

即使我认为@Phil H给了我问题的答案,作为正确的方法,我有其他理由以@ ben336评论的方式来做。这可能不合适,但我发布了解决方案的最终结果。幸运的是,我已经在我的启动脚本中的其他位置使用了gaSidetabs数组。我刚刚为每个数组的.name属性分配了一个字符串值。很高兴知道是否有办法“获得”我称之为数组的符号名称(或任何你想称之为的名称),但听起来这是不可能的。

ActiveDocument.gaShapesTab1 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape1"],ActiveDocument.Sections["Dashboard"].Shapes["Shape2"]);
ActiveDocument.gaShapesTab2 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape3"],ActiveDocument.Sections["Dashboard"].Shapes["Shape4"]);
ActiveDocument.gaShapesTab3 = new Array(ActiveDocument.Sections["Dashboard"].Shapes["Shape5"],ActiveDocument.Sections["Dashboard"].Shapes["Shape6"]);
ActiveDocument.gaShapeArrays = new Array(gaShapesTab1, gaShapesTab2, gaShapesTab3);
ActiveDocument.gaSidetabs = new Array('Tab1','Tab2','Tab3');

// Assigns a .name javascript property to each array.  assumes the order and length of the arrays is the same.
if (gaShapeArrays.length == gaSidetabs.length) 
    {
        for (var x = 0; x < gaShapeArrays.length; x++) 
        {
            gaShapeArrays[x].name = gaSidetabs[x];
        }
    }
else 
{
    Console.Writeln('Warning: gaShapeArrays and gaSidetabs are not the same length. Some names will not be assigned.');
}

// go through an array of arrays
for(var x=0; x<gaShapeArrays.length; x++)
{ 
    // and go through the objects of each one
    for(var y=0; y<gaShapeArrays[x].length; y++)
    {
        // if "object" is in the array
        if(object == gaShapeArrays[x][y])
        {
            // get "sidetab" from object's array's name
            var sidetab = gaShapeArrays[x].name.replace('gaShapes',''); // assumes that shapearrays will have naming convention gaShapesSidetab
            // we found it, we can stop now
            break;
        }
    }
}

Alert(sidetab);

也很高兴我能在这里弄清楚如何保留代码块的格式。