Jump to content
  • 0

return в две отдельные фукции


rediskavet
 Share

Question

Вопрос скорее теоретический поэтому попробую сформулировать словами.

Есть две фукнции( A и B ) в которых после некоторых манипуляций отались два массива ссылок(в каждой по одному). Есть третяя функция© в которую поочередно приходят массивы из функций A и B, которая умеет сравнивать полученные массивы и искать недостающие ссылки в каждом.

Затык в том как вернуть из функции C данные обратно в A и B. return-ом не получается, он только в одну возвращает, в ту которая последняя вызвала функцию©.

Можете отослать меня в гугл, но помогите правильно составить поисковой запрос.

Edited by rediskavet
Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

В самом конце есть 'arrToReturn', его и нужно вернуть две функции из которых пришли данные.


function toCompareArrays(incomingArr){
if(this.name == 'blackMagic_ForSiteMapHTML'){
toCompareArrays.linksFromHtml = incomingArr;
}
else if(this.name == 'blackMagic_ForSiteMapXML'){
toCompareArrays.linksFromXml = incomingArr;
}
else alert('сравнивать можно два и/или больше набора ссылок');

if(toCompareArrays.linksFromHtml){
if(toCompareArrays.linksFromXml){
var notFoundLinks_XML = toCompareArrays.linksFromXml;
var notFoundLinks_HTML = toCompareArrays.linksFromHtml;
if(notFoundLinks_XML.length > notFoundLinks_HTML.length){
first_level_1:
for(var i=0; i < notFoundLinks_XML.length; i++){
for(var j=0; j < notFoundLinks_HTML.length; j++){
if(notFoundLinks_HTML[j] == notFoundLinks_XML[i]){
notFoundLinks_HTML.splice(j,1);
j--;
notFoundLinks_XML.splice(i,1);
i--;
continue first_level_1;
}
}
}
//console.log('это то что осталось от XML \n' + notFoundLinks_XML.join('\n'));
//console.log('это то что осталось от HTML \n' + notFoundLinks_HTML.join('\n'));
}
else{
alert('HTML больше чем XML');
first_level_2:
for(var i=0; i < notFoundLinks_HTML.length; i++){
for(var j=0; j < notFoundLinks_XML.length; j++){
if(notFoundLinks_XML[j] == notFoundLinks_HTML[i]){
notFoundLinks_HTML.splice(i,1);
i--;//элементы сдвинулись после удаления, нужно простмотреть его еще раз
notFoundLinks_XML.splice(j,1);
j--;//элементы сдвинулись после удаления, нужно простмотреть его еще раз
continue first_level_2;
}
}
}
//console.log('это то что осталось от XML \n' + notFoundLinks_XML.join('\n'));
//console.log('это то что осталось от HTML \n' + notFoundLinks_HTML.join('\n'));
}
}
}

var arrToReturn = {
XML: notFoundLinks_XML,
HTML: notFoundLinks_HTML,
};
}

Link to comment
Share on other sites

  • 0
//элементы сдвинулись после удаления, нужно простмотреть его еще раз

чтобы такого не было используют обратный порядок обхода: max --> min

notFoundLinks_XML.length

эта вычисляется на каждой итерации цикла. Привет производительности )

for(var i=0; i < notFoundLinks_HTML.length; i++){
for(var j=0; j < notFoundLinks_XML.length; j++){
if(notFoundLinks_XML[j] == notFoundLinks_HTML[i]){
notFoundLinks_HTML.splice(i,1);
i--;//элементы сдвинулись после удаления, нужно простмотреть его еще раз
notFoundLinks_XML.splice(j,1);
j--;//элементы сдвинулись после удаления, нужно простмотреть его еще раз
continue first_level_2;
}
}
}

for(var i=0; i < notFoundLinks_XML.length; i++){
for(var j=0; j < notFoundLinks_HTML.length; j++){
if(notFoundLinks_HTML[j] == notFoundLinks_XML[i]){
notFoundLinks_HTML.splice(j,1);
j--;
notFoundLinks_XML.splice(i,1);
i--;
continue first_level_1;
}
}
}

повторяющийся код не лучше ли вынести в отдельную функцию?

toCompareArrays.linksFromHtml = incomingArr;

зачем вы устанавливаете св-во функции? Оно настолько надо?

Попробуйте использовать функцию для сравнения, в которую будете передавать два массива ссылок.

Link to comment
Share on other sites

  • 0

Спасибо за полезные советы подсказки.

Попробуйте использовать функцию для сравнения, в которую будете передавать два массива ссылок.

Это как бы и есть функция для сравнения массивов(в первом сообщении я ее назвал функция C ), она получает два массива ссылок, из двух других функций и сравнивает их между собой. Проблема у меня в возвращении результата проверки. Я умею это только return-ом делать, тут так не получается, т.к. списки ссылок приходят на сравнение из двух разных функций, поэтому ретурн возвращает ответ в последнюю вызвавшую его функцию.

Link to comment
Share on other sites

  • 0

мне кажется вы что-то очень-очень неправильно делаете. Инкапсуляция нервно курит в стороне )

Есть две фукнции( A и B ) в которых после некоторых манипуляций отались два массива ссылок(в каждой по одному). Есть третяя функция© в которую поочередно приходят массивы из функций A и B, которая умеет сравнивать полученные массивы и искать недостающие ссылки в каждом.

Затык в том как вернуть из функции C данные обратно в A и B. return-ом не получается, он только в одну возвращает, в ту которая последняя вызвала функцию©

такого еще не придумали, чтобы вернуть сразу в две функции

она получает два массива ссылок

а это что такое?

function toCompareArrays(incomingArr){

где здесь два массива?

давайте код функций A и B

Link to comment
Share on other sites

  • 0

function toCompareArrays(incomingArr){

где здесь два массива?

Ну правильно, они же туда поочередно прихдят, по одному. Там ниже провека, ни чего не будет пока оба массива не придут(может после будет третий, но его возвращаеть не надо будет). Вот в этих строчках:


if(toCompareArrays.linksFromHtml){
if(toCompareArrays.linksFromXml){

давайте код функций A и B

Не думаю что поможет, там все нормально работает как задумывалось.


function blackMagic_ForSiteMapXML(){
//console.log("вызвал функцию blackMagic_ForSiteMapXML");
//получаем массив ссылок
if($('.input-sitemapXml__form-textarea').val()){
var inputText = $('.input-sitemapXml__form-textarea').val();//значение введенных данных, одна строка
var allInputLinks = new Array;
var allInputLinksURLs = new Array;
allInputLinks = $(inputText).find("loc");
for(i=0; i < allInputLinks.length; i++){
allInputLinksURLs[i] = $(allInputLinks[i]).text();
}
var allInputLinksURLs_duplicate = findDuplicateLinks(allInputLinksURLs);//отправил на поиск двойных ссылок, вернул массив из двух массивов
// !!! allInputLinksURLs_duplicate[1] - двойные
// !!! allInputLinksURLs_duplicate[0] - все без повторяющихся
toCompareArrays.call(blackMagic_ForSiteMapXML,allInputLinksURLs);//отправил на сравнение с другим массивами


}//if
}

function blackMagic_ForSiteMapHTML(){
//получаем массив ссылок
if($('.input-sitemapHtm__form-textarea').val()){
var inputText = $('.input-sitemapHtm__form-textarea').val();//значение введенных данных, одна строка
var allInputLinks = new Array;
var allInputLinksURLs = new Array;
var allInputLinksAnchor = new Array;
allInputLinks = $(inputText).find("A");
for(i=0,j=0; i < allInputLinks.length; i++,j++){
allInputLinksURLs[i] = $(allInputLinks[i]).attr('href');
allInputLinksAnchor[i] = $(allInputLinks[i]).text();
}
var allInputLinksURLs_duplicate = findDuplicateLinks(allInputLinksURLs);//отправил на поиск двойных ссылок, вернул массив из двух массивов
var notFoundLinks = toCompareArrays.call(blackMagic_ForSiteMapHTML,allInputLinksURLs);//отправил на сравнение с другим массивами

}//if
}

Link to comment
Share on other sites

  • 0

Вы в курсе, что св-во name функций не стандартное и оно есть не везде? Код не будет работать в IE8.

for(i=0,j=0; i < allInputLinks.length; i++,j++){

только не говорите мне, что переменные i и j определяются в коде ранее. allInputLinks.length - пересчитывается каждую итерацию

Ну правильно, они же туда поочередно прихдят, по одному.

потрясающая логика. Мне начинает казаться, что я Вам не смогу помочь :)

Edited by nerv
Link to comment
Share on other sites

  • 0
Вы в курсе, что св-во name функций не стандартное и оно есть не везде? Код не будет работать в IE8.

Это не для сайта. Это облегчает мне на работе процесс поддержки сайтов за которые я отвечаю. Поэтому другие браузеры кроме фф не интересуют. Но все-же спасибо за советы по оптимизации кода.

потрясающая логика. Мне начинает казаться, что я Вам не смогу помочь

да, похоже. Но все-же хотелось бы понять свои логические просчеты, можно поточнее? что я там неправильно сделал.

Link to comment
Share on other sites

  • 0

ну, мне кажется, если вы собираетесь что-то сравнивать в вашей функции для сравнения, то сравниваемые аргументы должны передаваться сразу. Они там друг с другом сравниваются или как?

Link to comment
Share on other sites

  • 0
ну, мне кажется, если вы собираетесь что-то сравнивать в вашей функции для сравнения, то сравниваемые аргументы должны передаваться сразу. Они там друг с другом сравниваются или как?

Я не собираюсь, я уже сравниваю и получаю правильный результат. Единственная проблема на данном этапе это вернуть данные сравнения обратно.

В любом случае спасибо. Все советы по оптимизации кода приму к сведению, как только с этим разберусь.

Возвращаясь к первому сообщению. Как сделать return в две отдельные функции. Или я изначально всю логику неправильно продумал или должны быть какие-то алгоритмические ходы что-бы с этим разобраться.

Edited by rediskavet
Link to comment
Share on other sites

  • 0
Или я изначально всю логику неправильно продумал

да. Слово продумал лишнее.

Как сделать return в две отдельные функции.

как научить лошадь прыгать на одной ноге? Получить значение, возвращаемое функцией не проблема, но для этого ее надо сначала вызвать. Т.е., чтобы вернуть значению в две функции, ее надо вызвать из двух функций. Или сохранить результат первого вызова и передать его в функцию #2.

Edited by nerv
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy