2015-06-17 5 views
-2

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

Код работает до поиска имени «Джо», тогда он говорит, что par2 не определен ... Почему? При проверке после функции поиска я ясно видеть, что оба параметра par1 и par2 возвращаются ...

var friends = {}; 
friends.bill = { 
    firstName: "Bill", 
    lastName: "Gates", 
    number: "(206) 555-5555", 
    address: ['One Microsoft Way', 'Redmond', 'WA', '98052'] 
}; 
friends.steve = { 
    firstName: "Steve", 
    lastName: "Jobs", 
    number: "(408) 555-5555", 
    address: ['1 Infinite Loop', 'Cupertino', 'CA', '95014'] 
}; 

function list(obj) { 
    for (var prop in obj) { 
    console.log(prop); 
    } 
}; 

function bettersearch(name2) { 
    var sna = name2 
    for (var prop in friends) { 
    if (friends[prop].firstName === name2) { 
     // console.log("Value found :",friends[prop]); 
     return { 
     par1: friends[prop], 
     par2: sna 
     } 
    } 
    } 
}; 

// Test if the variables are returned 
var test = bettersearch("Bill") 
console.log("\n\n",test); 
console.log("\n\n",test.par1); 
console.log("\n\n",test.par2); 


//Formatting function for a nice Output 
function format(obj) { 
    if (obj) { 
    var result = ""; 
    result += "\nName: " + obj.par1.firstName + " " + obj.lastName; 
    result += "\nNumber: " + obj.par1.number; 
    result += "\nAddress: " + obj.par1.address.join(', '); 
    console.log(result); 
    } else { 
    console.log("\nDer Name", obj.par2, "wurde nicht gefunden"); 
    } 
} 

//Call the functions 
format(bettersearch("Bill")); 
format(bettersearch("Steve")); 
format(bettersearch("Joe")); 
+0

Пожалуйста, прочитайте это Http: //stackoverflow.com/help/how-to-ask –

+0

Когда происходит ошибка? В то время как в 'bettersearch' функция или когда вы делаете' format' на нем? – Peter

+1

Где мой "Joe" объект в друзьях? –

ответ

3

Then it say par2 is not defined...

Нет, это не так. Он говорит что-то вроде Cannot convert 'obj' to object или Cannot access 'par2' on undefined.

Why?

Поскольку ваша bettersearch функция не возвращает ничего , когда он не находит имя. В вашей функции format вы явно проверяете наличие obj, но, несмотря на это undefined, вы пытаетесь получить доступ к obj.par2.

Я думаю, что вы ищете

function bettersearch(name) { 
    for (var prop in friends) 
    if (friends[prop].firstName === name) 
     return { 
     friend: friends[prop], 
     name: name 
     }; 
    return { 
    name: name 
    }; // always return a result object 
} 

function format(obj) { 
    if (obj.friend) { 
    var result = ""; 
    result += "\nName: " + obj.friend.firstName + " " + obj.friend.lastName; 
    result += "\nNumber: " + obj.friend.number; 
    result += "\nAddress: " + obj.friend.address.join(', '); 
    console.log(result); 
    } else { 
    console.log("\nDer Name", obj.name, "wurde nicht gefunden"); 
    } 
} 
+0

Хороший улов, я на самом деле не заметил этого, пока не прочитал его в вашем ответе. –

+0

Омг ... ты совершенно прав. он не может вернуть объект, если он не получает доступ к этой части кода ... THX – Pandaroc

0

Фактическая ошибка

"TypeError: Cannot read property 'par2' of undefined

Ваша ошибка в вашей console.log() строке, где if(obj) возвращает ложные (то есть нет объекта - это на самом деле не определено):

console.log("\nDer Name", obj.par2, "wurde nicht gefunden"); 

Удалите эту линию.

+0

Ошибка в вашей строке 'console.log()'. Вам нужно только удалить это. – Drakes

1

Это могло бы быть гораздо лучше структурировать данные и написать search функцию

var friends = [ 
    { 
     firstName: "Bill", 
     lastName: "Gates", 
     number: "(206) 555-5555", 
     address: ['One Microsoft Way', 'Redmond', 'WA', '98052'] 
    }, 
    { 
     firstName: "Steve", 
     lastName: "Jobs", 
     number: "(408) 555-5555", 
     address: ['1 Infinite Loop', 'Cupertino', 'CA', '95014'] 
    } 

]; 

function searchFriends(firstName) { 
    return friends.filter(function(f) { 
    return f.firstName === firstName; 
    }); 
} 

console.log(searchFriends("Bill")); 
//=> [{"firstName":"Bill","lastName":"Gates","number":"(206) 555-5555","address":["One Microsoft Way","Redmond","WA","98052"]}] 

console.log(searchFriends("Steve")); 
//=> [{"firstName":"Steve","lastName":"Jobs","number":"(408) 555-5555","address":["1 Infinite Loop","Cupertino","CA","95014"]}] 

console.log(searchFriends("Joe")); 
//=> [] 

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

E.g., а как насчет John Smith и John Smyth? Как бы использовать friends.john ...


Если вы хотите, чтобы результаты поиска, чтобы вернуть запрос и спички

function searchFriends(firstName) { 
    return { 
    search: firstName, 
    result: friends.filter(function(f) { 
     return f.firstName === firstName; 
    }) 
    }; 
} 

Используйте его таким же образом

console.log(searchFriends("Steve")); 
// { 
// search: "Steve", 
// result: [{"firstName":"Steve","lastName":"Jobs","number":"(408) 555-5555","address":["1 Infinite Loop","Cupertino","CA","95014"]}] 
// } 

console.log(searchFriends("Joe")); 
// { 
// search: "Joe", 
// result: [] 
// } 
Смежные вопросы