-2

下面,我有一组对象数组。我一直在寻找我的对象,一旦找到它所在的数组,我就想找到并使用该数组的名称作为字符串。我的猜测是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 都适用。例如,我无权访问窗口或文档。

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

4

3 回答 3

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")。您不能就地更改此字符串,我认为您也不想这样做。如果您可以阐明为什么需要更改数组的名称,那么可能会清楚如何解决该问题。例如,您是否有其他代码需要数组具有特定名称?

于 2013-05-07T15:47:40.787 回答
0

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

所以:

if(object == gaShapeArrays[x][y])
{
    // Found the object! It's in [x][y], so in array gaShapeArrays[x] which
    // itself is in gaShapeArrays
}
于 2013-05-07T15:46:57.547 回答
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);

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

于 2013-05-08T21:02:24.217 回答