【问题标题】:Javascript parsing?Javascript 解析?
【发布时间】:2015-05-12 18:55:42
【问题描述】:

我正在为 adobe after effects 编写extendscript 中的代码,最终变成了 javascript。

我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_RIG_008_masterLayer 组装字符串

var comps = ["_MAIN", "jc3_RIG_008_masterLayer assemble","jc3_RIG_008_masterLayer contact sheet", "[Z] source", "MM004 source"];

我不确定实现这一目标的最佳/最有效方法是什么,但任何想法都会有所帮助。

谢谢。

【问题讨论】:

  • 澄清一下:您有数组comps,并且您想从该数组中找到包含单词“assemble”的元素?
  • 没有高效的方法,它总是 O(n),除非你有一组预定义的字符串并且你只会搜索这些字符串,然后可以通过创建映射来优化它。

标签: javascript regex parsing extendscript after-effects


【解决方案1】:

@josegomezr 使用简单循环的想法是正确的。我更新了这个想法以返回海报正在寻找的字符串。

var comps = ["_MAIN", "jc3_RIG_008_masterLayer assemble","jc3_RIG_008_masterLayer contact sheet", "[Z] source", "MM004 source"];
var compWithAssemble;
for(var i in comps){
    if(comps[i].indexOf("assemble") > -1){
        compWithAssemble = comps[i];
        break;
    }
}
// compWithAssemble has the string you are looking for.
console.log(compWithAssemble);

【讨论】:

  • 根据MDNArray.filter自ECMAScript标准5.1起存在,根据@Frxstrem ExtendScript只完成ECMAScript标准3。
  • 我更新了我的答案以使用像 josegomezr 这样的简单循环。我的返回海报正在寻找的字符串。
  • 请注意:如果这是一个大数组,使用 indexOf 会更好。 search 一般在你想使用正则表达式时使用。在这种情况下,这显然无关紧要。
  • 感谢您的提醒。我把它改成indexOf,反正我常用的就是这个。
【解决方案2】:

正常的 for 循环应该可以解决问题。根据some sources,这是最快的方法。根据other sources,使用indexOf() 也比使用search() 更快:

for (var i = 0, len = comps.length; i < len ; i++) {
   if (comps[i].indexOf('assemble') > -1) return comps[i]; //or store and break
}

var comps = ["_MAIN", "jc3_RIG_008_masterLayer assemble","jc3_RIG_008_masterLayer contact sheet", "[Z] source", "MM004 source"];

    comps.forEach(function(el) {
       if (el.indexOf('assemble') > -1) document.write('loop 1: ' + el + '<br>');
    });


    for (var i = 0, len = comps.length; i < len ; i++) {
       if (comps[i].indexOf('assemble') > -1) document.write('loop 2: ' + comps[i]);
    }
&lt;div id="output"&gt;&lt;/div&gt;

我会把这个留在这里作为参考:

这样的东西适用于任何支持 ECMAScript5 的东西(但根据来源和@frxstrem,这在 ExtendedScript 中不可用):

comps.forEach(function(el) {
   if (el.indexOf('assemble') > -1) return el;
});

【讨论】:

  • array.forEach 不返回数组,但您可以提前中断循环。 Source。要返回过滤元素的数组,请使用 array.filterarray.map
  • 根据this answer,截至去年,ExtendScript 只符合 ECMAScript 3 标准。我认为 Adob​​e 从那时起就没有更新 ExtendScript。
  • "...最终成为 javascript" 我认为它会更新。看起来 ECMAScript3 + 4 中的一些功能是可用的。
  • @josegomezr 我不想返回一个数组。 OP 要求提供一个字符串。
【解决方案3】:

如果是纯 JS 你可以这样做:

var found = false;
for(var i in comps){
    if(comps[i].search("assemble") != -1){
        found = true;
        break;
    }
}
if(found){
    // your code if found
}else{
    // your code if not.
}

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 2011-07-18
    • 2014-07-02
    • 2022-01-10
    • 2011-10-03
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多