Замена падежа имен собственных из именительного в родительный

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

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

Участник
Топикстартер
Сообщения
251
Реакции
4
Пишу скрипт меняющий падежи имен собственных. На определенном этапе встала проблема - преобразовать ассоциативный массив в строку. Беру пример из учебника:
Код:
var user = {

  firstName: 'Василий'
};
alert( user ); // [object Object]
Если так, содержимое объекта не выводится, то вот так:
Код:
var user = {

  firstName: 'Василий',
  toString: function() {
    return 'Пользователь ' + this.firstName;
  }
};
alert( user );  // Пользователь Василий
- все замечательно :)

Аналогично пытаюсь применить к своему объекту:
Код:
var name={};

name['Сергей']='Сергия';
name['Борис']='Бориса';

toString: function() {
    return this.name;
}
alert (name);  // [object Object]
- ничего не получается :(
Как ничего не меняя в самом объекте вывести его содержимое?
 
На самом деле задача не в преобразовании массива в строку. В процессе работы скрипта делается проверка на наличии имени в массиве и если оно там есть, то имя (переменная) заменяется её значением (именем в родительном падеже). А как сделать проверку, есть ли имя в значениях? Например, Валентина, может быть как женским именем в именительном падеже, так и мужским в родительном.
 
Как ничего не меняя в самом объекте вывести его содержимое?

alert(obj.toSource())

скажите, вы основы javascript изучали? если нет, то лучше с них начать, так будет намного проще.

а определять, какое из одинаково пишущихся слов используется в контексте задача нетривиальная
 
alert(obj.toSource())

скажите, вы основы javascript изучали? если нет, то лучше с них начать, так будет намного проще.

Собственно именно этим я и занимаюсь :) ... по совету azz-a Первые шаги и шишки :) | Страница 2 | Форум RUDTP.RU — дизайн, верстка, препресс, печать

а определять, какое из одинаково пишущихся слов используется в контексте задача нетривиальная
Я и не считаю возможным решить ее программно, а только собираюсь пометить цветом такие слова, чтобы принимать по ним решение, исходя из контекста.
 
Почему-то не со всеми объектами работает как хотелось бы :( В частности вот в этом куске :
Код:
var mySampleForSearchWord = '\\b\\w*[А-Яа-я]+\\w*\\b';
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;               
myFoundedWords = app.findGrep();

alert (myFoundedWords.toSource());
выдает жуть %))
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    153.7 КБ · Просм.: 1 042
if(obj['имя']!=undefined) {}
Простите, никак не соображу, к какому объекту мне применять эту проверку? У меня есть объект myFoundedWords, состоящий из найденных имен. Пусть это будут : Сергей, Павел и Бориса (Борис уже в родительном падеже) и словарь :
Код:
var name={};

name['Сергей']='Сергия';
name['Борис']='Бориса';

Последовательно проверяя слова из myFoundedWords на наличие в словаре я получаю Павел и Бориса - undefined. А мне нужно получить только Павла, чтобы пометить его заливкой, а Бориса не трогать.
 
name надо проверять. а myFoundedWords это массив, каждый его элемент надо смотреть myFoundWords.contents
 
name надо проверять. а myFoundedWords это массив, каждый его элемент надо смотреть myFoundWords.contents
Ещё раз внимательно прочитайте предыдущее сообщение. Я так и делаю, но когда я проверяю name - я получаю Павла и Бориса - undefined . А мне нужно (вынужден повторить) получить только Павла, чтобы пометить его заливкой, а Бориса не трогать. Это ежу ясно, что из myFoundWords я достаю слова contents-ом.
 
Ещё раз внимательно прочитайте предыдущее сообщение. Я так и делаю, но когда я проверяю name - я получаю Павла и Бориса - undefined . А мне нужно (вынужден повторить) получить только Павла, чтобы пометить его заливкой, а Бориса не трогать. Это ежу ясно, что из myFoundWords я достаю слова contents-ом.

так у вас в объекте-словаре нет ни "Павла", ни "Бориса". У вас есть "Сергей" и "Борис". Внимательно посмотрите, что вы делаете. А лучше всего разобраться для начала с объектами и свойствами, вы по-моему просто лепите наугад что-то, не понимая как это работает.

допустим, берем объект
var foo={};

определяем в нем свойство bar со значением xxx

foo['bar']='xxx';

тогда foo['bar'] вернет 'xxx', а foo['xxx'] вернет undefined. Потому что свойства 'xxx' у объекта нет, мы его не определили

так понятно?
 
Дайте нам код как проверяете.
Код:
var mySampleForSearchWord = '\\b\\w*[А-Яа-я]+\\w*\\b';
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;               
myFoundedWords = app.findGrep();

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение снизу вверх
    for (j=myFoundedWords.length-1; j >= 0; j--) { //  j >= 0
       
        myLine = myFoundedWords[j];
       
                var myWord = myRightName[myLine.contents]; // найденное имя  передается в ассоциативный массив
                                                               
              if (myWord == undefined) {// такого имени в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }              
        if (myWord[0] == "*") { // возможны варианты написания этого имени
            myLine.fillColor = "myProblemColor";
            continue;
            }
        // замена слова
        myLine.contents = myWord;      
        } // j >= 0
} // != 0
 
так у вас в объекте-словаре нет ни "Павла", ни "Бориса". У вас есть "Сергей" и "Борис". Внимательно посмотрите, что вы делаете. А лучше всего разобраться для начала с объектами и свойствами, вы по-моему просто лепите наугад что-то, не понимая как это работает.

Лучше всего вам для начала спуститься с позиции великого умника, разговаривающего с идиотом и ВНИМАТЕЛЬНО (вынужден нарушить правила и для особо великих В ТРЕТИЙ РАЗ повторить то что уже писал выше). Вам бы следовало обратить внимание на мое сообщение #7 "...У меня есть объект myFoundedWords, состоящий из найденных имен. Пусть это будут : Сергей, Павел и Бориса (Борис уже в родительном падеже) и словарь :."


допустим, берем объект
var foo={};

определяем в нем свойство bar со значением xxx

foo['bar']='xxx';

тогда foo['bar'] вернет 'xxx', а foo['xxx'] вернет undefined. Потому что свойства 'xxx' у объекта нет, мы его не определили

так понятно?
А это оставьте для альтернативно одаренных :) Кусок кода в ответе boriskasmoscow-у (сообщение #12) , если есть желание, можете с ним разобраться.
Так понятно ?
 
Дайте нам код как проверяете.
Забыл пояснить.
myRightName - имя словаря, вернее функции, возвращающей найденное имя в родительном падеже.
Код:
var myRightName = (function()
{
var name={};
name['Борис']='Бориса';
name['Сергей']='Сергия';
return(name);
})();
 
Хочу еще раз для внимательных четко сформулировать задачу. Как видно из кода, я помечаю цветом
"myAbsentColor" имена, отсутствующие в словаре (вернее я так хочу :) ), чтобы затем внести их в словарь. Но помечаются вместе с ними так же и имена уже стоящие в родительном падеже, а мне этого не нужно. И, похоже, решения этой задачи нет :( Даже если я преобразую массив-словарь в строку, чтобы поиском найти там "Бориса" (в род.падеже), то не смогу в поисковый шаблон вставить переменную. Или можно как-то?
 
Сергей, слушайте что Вам говорят и не нервничайте. Не то советников растеряете с Вашим гонором.
 
У меня есть объект myFoundedWords, состоящий из найденных имен. Пусть это будут : Сергей, Павел и Бориса

словарь
var name={};

name['Сергей']='Сергия';
name['Борис']='Бориса';

но когда я проверяю name - я получаю Павла и Бориса - undefined


в объекте name
name['Павел'] - undefined
name['Бориса'] - undefined

почему вы считаете, что должно получиться что-то другое?

если хотите искать не в ключах, а в значениях, то надо или объект по-другому формировать, или поиск делать собственно по значениям, но это долго перебирать при большом словаре.
Код:
for(var prop in name)
{
  if(name[prop]) {
  …
   break;}
}

перевернуть вот так можно
name['Сергия']='Сергей';
name['Бориса']='Борис';

в коде

Код:
var namesReversed = {};
for(var prop in name)
  namesReversed[name[prop]] = prop;

var myRightName = (function()
{
var name={};
name['Борис']='Бориса';
name['Сергей']='Сергия';
return(name);
})();

и зачем? достаточно
var myRightName={};
myRightName['Борис']='Бориса';
myRightName['Сергей']='Сергия';

и точно так же к нему обращаться.
 
Последнее редактирование:
если хотите искать не в ключах, а в значениях, то надо или объект по-другому формировать, или поиск делать собственно по значениям, но это долго перебирать при большом словаре.
Код:
for(var prop in name)
{
  if(name[prop]) {
  …
   break;}
}

перевернуть вот так можно
name['Сергия']='Сергей';
name['Бориса']='Борис';

в коде

Код:
var namesReversed = {};
for(var prop in name)
  namesReversed[name[prop]] = prop;



и зачем? достаточно


и точно так же к нему обращаться.

Да, сложновато получается. Овчинка выделки не стоит. Если применять скрипт не ко всему тексту, а только к выделенному фрагменту, то вышеназванная задача снимается. Но у меня не получается это сделать. Помогите, пожалуйста.
 
...получить только Павла, чтоб пометить его заливкой
Код:
var name={};

name['Сергей']='Сергия';
name['Борис']='Бориса';

var myFoundedWords = ['Сергей', 'Павел', 'Бориса'];

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение снизу вверх
    for (var j=myFoundedWords.length-1; j >= 0; j--) { //  j >= 0
      
        myWord = myFoundedWords[j];      
        var myFlag0 = myCheckName(myWord);
        var myFlag1 = myCheckProperty(myWord);
        if(!myFlag0 && !myFlag1)
        alert(myWord+" нет в массиве name (ни как значение, ни как свойство), надо красить") ;
                                                              
        } // for
} // != 0

function myCheckProperty(prop)
{
if (name.hasOwnProperty(prop)) return true;

return false;
};

function myCheckName(myName)
{
    for(var i in name)
    {
        if (name[i] == myName) return true;
    }
return false;
}
 
Статус
Закрыто для дальнейших ответов.