Как пополнить массив, объявленный внутри функции?

Статус
Закрыто для дальнейших ответов.

Сергий Задонский

Участник
Топикстартер
Сообщения
251
Реакции
4
Пытаюсь написать скрипт, пополняющий словарь. В 25 строке ругается: "Нет определения accent". Как сделать правильно?

Код:
/*#include TestAccent.jsx  /*словарь, вида:
    var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
accent['абие']='=абие';
accent['авва']='=авва';
accent['умывающая']='умыв=ающая';
accent['хвалебноблагодарственное']='хвалебноблагод=арственное';
accent['христе']='христ=е';
accent['читается']='чит=ается';
accent['явившу']='яв=ившу';
accent['якоже']='=якоже';

return(accent);
})();
*/
myDoc = app.activeDocument;
var myTextFrame = myDoc.pages[0].textFrames[0];
for (j=0; j <= myTextFrame.words.length-1; j++){
    var myWord = myTextFrame.words[j];
    myWord = myWord.contents.toLowerCase().replace(/\u00AD/, '');   
    myWord = myWord.replace(myWord, 'accent\[\''+myWord+'\'\]\=\'\*\';');
    accent.push(myWord.toLowerCase());
  }
 
А вообще говоря - вы же сами на свой вопрос и ответили - вы пытаетесь извне функции получить доступ к локально объявленному внутри нее массиву. Вынесите строку "var ..." из функции наружу и будет вам счастье
 
да это и не массив для начала. и закомментировано дофига.
надо делать большую работу над ошибками )

а скажите, зачем вообще эта функция?

Код:
 var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
accent['абие']='=абие';
accent['авва']='=авва';
accent['умывающая']='умыв=ающая';
accent['хвалебноблагодарственное']='хвалебноблагод=арственное';
accent['христе']='христ=е';
accent['читается']='чит=ается';
accent['явившу']='яв=ившу';
accent['якоже']='=якоже';

return(accent);
})();

почему не хотите просто объявить объект?
Код:
var accent={};
accent['аарон']='аар=он';
accent['абие']='=абие';
accent['авва']='=авва';
accent['умывающая']='умыв=ающая';
accent['хвалебноблагодарственное']='хвалебноблагод=арственное';
accent['христе']='христ=е';
accent['читается']='чит=ается';
accent['явившу']='яв=ившу';
accent['якоже']='=якоже';
 
да это и не массив для начала. и закомментировано дофига.
надо делать большую работу над ошибками )
Закомментировано "дофига" не просто так, а пояснение для тех, кто захотел бы разобраться в сути. Это кусочек словаря, состоящего уже на данный момент из 114+ тысяч слов и подключающегося к скрипту автоматической расстановки ударений в тексте (#include TestAccent.jsx. ).

а скажите, зачем вообще эта функция?

Код:
 var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
accent['абие']='=абие';
accent['авва']='=авва';
accent['умывающая']='умыв=ающая';
accent['хвалебноблагодарственное']='хвалебноблагод=арственное';
accent['христе']='христ=е';
accent['читается']='чит=ается';
accent['явившу']='яв=ившу';
accent['якоже']='=якоже';

return(accent);
})();
Эта функция возвращает слово с ударением из словаря на место слова без ударения
почему не хотите просто объявить объект?
Код:
var accent={};
accent['аарон']='аар=он';
accent['абие']='=абие';
accent['авва']='=авва';
accent['умывающая']='умыв=ающая';
accent['хвалебноблагодарственное']='хвалебноблагод=арственное';
accent['христе']='христ=е';
accent['читается']='чит=ается';
accent['явившу']='яв=ившу';
accent['якоже']='=якоже';
Думаю, ответ на этот вопрос понятен уже из вышесказанного. Теперь еще раз формулирую проблему. После автоматической расстановки ударений в тексте, остаются слова без ударений, которых пока нет в словаре, или ударение в них не однозначно (сЕрдца - сердцА). С помощью другого скрипта я собираю их в отдельный документ, сортирую однозначные от неоднозначных, преобразую их к виду, в котором они находятся в ассоциативном массиве и ... теперь их нужно туда добавить и не ручками, потому как слова в массиве выстроены по алфавиту и добавить несколько десятков слов на свои места в словарь из 114+ тыс. слов не просто...
 
Думаю, ответ на этот вопрос понятен уже из вышесказанного.

вообще-то, нет. функция возвращает этот же объект, так что она в принципе излишня. вы кстати ее даже не вызываете нигде, и нигде не инициализируете объект accent, к которому потом пытаетесь обращаться.
 
вообще-то, нет. функция возвращает этот же объект, так что она в принципе излишня. вы кстати ее даже не вызываете нигде, и нигде не инициализируете объект accent, к которому потом пытаетесь обращаться.
Пожалуйста, прочитайте еще раз внимательно, что я написал выше :"...Это кусочек словаря, состоящего уже на данный момент из 114+ тысяч слов и подключающегося к скрипту автоматической расстановки ударений в тексте (#include TestAccent.jsx. )." Эта функция работает в ДРУГОМ скрипте.
 
А вообще говоря - вы же сами на свой вопрос и ответили - вы пытаетесь извне функции получить доступ к локально объявленному внутри нее массиву. Вынесите строку "var ..." из функции наружу и будет вам счастье
.
Кстати да, а значит и инициализировать можно попроще типа
Ага. Если бы все так просто было...':(8'
 
Ваша манера подачи информации просто чудовищна %8
Только сейчас до меня дошло, что закомментированный кусок вы вставили чисто для того, чтобы показать вид словаря, который формируете.
Но все равно все претензии те же: 1) функция myAccent возвращает локально определенный внутри нее объект и вообще не нужна, можно ограничиться простой инициализацией словаря, по приведенному мной выше принципу
2) в строке 25 вы действительно ссылаетесь на не определенный нигде массив accent о чем вас честно и информирует индизайн
 
Ваша манера подачи информации просто чудовищна %8
Только сейчас до меня дошло, что закомментированный кусок вы вставили чисто для того, чтобы показать вид словаря, который формируете.
Но все равно все претензии те же: 1) функция myAccent возвращает локально определенный внутри нее объект и вообще не нужна, можно ограничиться простой инициализацией словаря, по приведенному мной выше принципу
2) в строке 25 вы действительно ссылаетесь на не определенный нигде массив accent о чем вас честно и информирует индизайн
В п.1) вы решаете нужна или нет функция, которая работает в скрипте, которого вы не видели, а в п.2) констатируете факт, который и без того очевиден и не даете даже тени ответа на вопрос, вынесенный в заголовок темы...:( Отвлекитесь от приведенного мной примера, придумайте пример, иллюстрирующий вопрос заголовка и покажите, как решать такую проблему. Вот это будет айс!
 
В п.1) вы решаете нужна или нет функция, которая работает в скрипте, которого вы не видели
%8Вы запутываете дело еще больше. Разве закомментированный кусок не часть этой функции? Если нет то зачем он приведен вообще?
в п.2) констатируете факт, который и без того очевиден и не даете даже тени ответа на вопрос, вынесенный в заголовок темы...
Ответ на него очевиден - объявить злополучный массив ассеnt перед циклом, так же как вы его локально в злополучной ненужной функции объявляете.
Мы друг друга не понимаем, вы через гуглтранслейт форум читаете?'hmmm'
 
Последнее редактирование модератором:
%8Вы запутываете дело еще больше. Разве закомментированный кусок не часть этой функции? Если нет то цензура он приведен вообще?
Закомментированный кусочек не часть, а вся функция, а вот массив внутри нее - да, часть словаря. Согласен, можно обойтись и без функции, но уж если она уже работает, то переделывать скрипт и весь огромный словарь не вижу смысла, а вот это:
Ответ на него очевиден - объявить злополучный массив ассеnt перед циклом, так же как вы его локально в злополучной ненужной функции объявляете.
я сейчас проверю. Ага, только как? Тащить все 114+ тыс. строк в скрипт?
Мы друг друга не понимаем, вы через гуглтранслейт форум читаете?'hmmm'
Рад, что с юмором у вас все в порядке ;)
 
Последнее редактирование модератором:
Я ж вам уже (кажется даже неоднократно) говорил - перенесите строку
var accent={};
из тела функции наружу - и все!
Не знаю, что не так, но даже убрав все и оставив только это:
Код:
myDoc = app.activeDocument;
var myTextFrame = myDoc.pages[0].textFrames[0];
var accent={};
for (j=0; j <= myTextFrame.words.length-1; j++){
    var myWord = myTextFrame.words[j];
    myWord = myWord.contents.toLowerCase().replace(/\u00AD/, '');   
    myWord = myWord.replace(myWord, 'accent\[\''+myWord+'\'\]\=\'\*\';');
    accent.push(myWord.toLowerCase());
  }
все равно не работает. Ругается: accent.push не является функцией.
 
естественно не работает, push это метод массива, a accent - не массив.

Код:
for (j=0; j <= myTextFrame.words.length-1; j++){
    var myWord = myTextFrame.words[j];
    myWord = myWord.contents.toLowerCase().replace(/\u00AD/, '');   
    accent[myWord] = '*';
  }

вот так сработает, только не очень понимаю, почему в исходном словаре значением было слово с ударениями, а здесь звездочка.
 
Я ж вам вторым постом ссылку на доку привел: хотите делать push, объявляйте accent как new Array()
 
естественно не работает, push это метод массива, a accent - не массив.

Код:
for (j=0; j <= myTextFrame.words.length-1; j++){
    var myWord = myTextFrame.words[j];
    myWord = myWord.contents.toLowerCase().replace(/\u00AD/, '');  
    accent[myWord] = '*';
  }

вот так сработает, только не очень понимаю, почему в исходном словаре значением было слово с ударениями, а здесь звездочка.
Звездочкой в словаре обозначены слова, в которых неоднозначное ударение (сЕрдца - сердцА). Основной скрипт, проставляющий ударения такие слова помечает красным цветом и оставляет на усмотрение пользователя.
 
Статус
Закрыто для дальнейших ответов.