Разбор Javascript?

Я что-то кодирую в extensionscript для Adobe After Effects, что в итоге становится javascript.

У меня есть массив, и я хотел бы выполнить поиск только по слову «собрать» и вернуть всю строку сборки jc3_RIG_008_masterLayer.

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

Я не уверен, что это лучший/самый эффективный способ добиться этого, но любые мысли помогут.

Спасибо.


person Amaylayinsues    schedule 12.05.2015    source источник
comment
Просто уточню: у вас есть массив comps, и вы хотите найти элемент из этого массива, который содержит слово assemble?   -  person Frxstrem    schedule 12.05.2015
comment
Не существует эффективного способа, это всегда O (n), за исключением случаев, когда у вас есть предопределенный набор строк, и вы будете искать только эти строки, тогда его можно оптимизировать путем создания карт.   -  person maraca    schedule 12.05.2015


Ответы (3)


У @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);
person Mike    schedule 12.05.2015
comment
Согласно MDN Array.filter существуют со стандарта ECMAScript 5.1, и, согласно @Frxstrem, ExtendScript выполняет только стандарт ECMAScript 3. - person josegomezr; 12.05.2015
comment
Я обновил свой ответ, чтобы использовать простой цикл, например josegomezr. Мой возвращает строку, которую ищет плакат. - person Mike; 12.05.2015
comment
Просто примечание: если бы это был большой массив, использование indexOf работало бы лучше. search обычно используется, когда вы хотите использовать регулярные выражения. Хотя в данном случае это явно не имеет значения. - person Mackan; 12.05.2015
comment
Спасибо за внимание. Я изменю его на indexOf, я обычно так и использую. - person Mike; 12.05.2015

Обычный цикл for должен помочь. Это самый быстрый способ согласно некоторым источникам< /а>. Кроме того, использование 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]);
    }
<div id="output"></div>

Я сохраню это здесь как ссылку:

Что-то вроде этого будет работать для всего, что поддерживает ECMAScript5 (но, согласно источникам и @frxstrem, это недоступно в ExtendedScript):

comps.forEach(function(el) {
   if (el.indexOf('assemble') > -1) return el;
});
person Mackan    schedule 12.05.2015
comment
array.forEach не возвращает массив, но цикл можно прервать раньше. Источник. Чтобы вернуть массив отфильтрованных элементов, используйте array.filter или array.map. - person josegomezr; 12.05.2015
comment
Согласно этому ответу, по состоянию на прошлый год ExtendScript соответствовал только стандарту ECMAScript 3. Я не думаю, что с тех пор Adobe не обновляла ExtendScript. - person Frxstrem; 12.05.2015
comment
...который в конечном итоге является javascript Я полагал, что он будет более современным. Похоже, ECMAScript3 + некоторые фичи из 4 — это все, что доступно. - person Mackan; 12.05.2015
comment
@josegomezr Я не пытаюсь вернуть массив. ОП запросил строку. - person Mackan; 12.05.2015

Если это простой 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.
}
person josegomezr    schedule 12.05.2015