循环遍历时,数组表现得很奇怪

时间:2011-08-30 20:20:24

标签: javascript arrays loops extendscript

function showMyLayers() {

                            var Mylayers = [
                                    ["ISO"],
                                    ["ODO"],
                                    ["Black Round Mask"],
                                    ["red glow on gauges"],
                                    ["Compass"],
                                    ["4 Gauges"],
                                    ["Upper Stainless Steel"],
                                    ["Background"]
                            ];

                    for (x in Mylayers) {
                            var activelayer = app.activeDocument.layers[x];
                            activelayer.visible = true;
                            activelayer = null;
                    }
} showMyLayers();  

它出错了: [“4 Gauges”],

假设数字正在搞乱阵列。任何想法为什么?这是extendcript,这是javascript但对于photoshop,如果你想知道。但它大部分基于JS,所以它应该表现得像它。

3 个答案:

答案 0 :(得分:4)

for..in循环将迭代对象。要迭代数组,请使用经典的for循环。更进一步,你所拥有的是一个数组数组,这可能不是你想要的。

var Mylayers = [
    "ISO",
    "ODO",
    "Black Round Mask",
    "red glow on gauges",
    "Compass",
    "4 Gauges",
    "Upper Stainless Steel",
    "Background"
];

for (var i = 0; i < Mylayers.length; i++) {
    var x = Mylayers[i];
    var activelayer = app.activeDocument.layers[x];
    activelayer.visible = true;
    activelayer = null;
}

答案 1 :(得分:3)

啊...... Adob​​e JavaScript ......

您的问题是您实际上是循环遍历数组的索引,而不是值。所以,你可能有一个0 ... 4层,但第5层可能是一个文件夹。

建议:

  1. 您使用的是嵌套数组而不是字符串。我会摆脱数组中项目周围的[]
  2. 使用for( x in Mylayers )
  3. 代替for(x in Mylayers){ var tmp = Mylayers[x]然后使用x
  4. 我不确定ExtendScript,但在JSFL(相当于Flash)中,访问图层对象的方式是图层[timeline.getLayerIndex(layerName)]

答案 2 :(得分:1)

我不认为你正在做你认为你正在做的事情。 Javascript中的for..in循环不是您可能习惯的foreach循环,并且在大多数情况下是循环数组的不良选择。它不是将x设置为数组中的实例元素,而是将x设置为对象中的下一个键。在这种情况下,数值(0,1,2 ......)。不幸的是,它还会循环遍历Array实例上的对象属性(length,forEach等)。

你真的应该使用常规for循环:

var MyLayers = [ 'foo', 'bar', 'baz' ];

for(var i = 0; i < MyLayers.length; i += 1) {
   app.activeDocument.layers[MyLayers[i]].visible = true;
}

您也不需要将事物显式设置为null。 Javascript是内存管理。