2017-02-12 3 views
1

Я не уверен, почему моя функция array.map возвращает undefined, но цикл for for возвращает результат. Когда я утешаю войти карта отображает:Использование array.map правильно

Том Дик Гарри

и когда консоль журнала для цикла он показывает

[ 'Том', 'Дик', «Гарри ']

Не уверен, что это проблема отображения undefiend.

var friends = ["Tom", "Dick", "Harry"]; 
var secondLevelFriends = ["Anne", "Harry", "Quinton"]; 
var allUsers = ["Tom", "Dick", "Harry", "Anne", "Quinton", "Katie", "Mary"]; 

function findPotentialFriends(existingFriends) { 
    return function(x) { 
    // existingFriends.map(function(elem) { 
    // if(elem === x) return false; 
    // else return true; 
    // }) 
    for(var i = 0; i < existingFriends.length; i++) { 
     if(existingFriends[i] === x) return false; 
     else return true; 
    } 
    } 
} 

var isNotAFriend = findPotentialFriends(friends); 
isNotAFriend(allUsers[0]); // false 

ответ

1

Прежде всего ваш цикл имеет некоторые логические задачи. она должна быть написана так, как:

var foundFriend = false; 
for(var i = 0; i < existingFriends.length; i++) { 
    if (existingFriends[i] === x) 
    { 
    foundFriend = true; 
    break; 
    } 
} 
return !foundFriend; 

Причина isNotAFriend вычисляется в undefined потому, что вы забыли return заявление. Кроме того, Arrays.map просто берет каждый элемент массива, передает его в функцию, а затем создает новый массив на основе возвращаемой вами функции. То, что вы, возможно, ищете, возможно, Array.some см. docs. Пример:

var friends = ["Tom", "Dick", "Harry"]; 
 
var secondLevelFriends = ["Anne", "Harry", "Quinton"]; 
 
var allUsers = ["Tom", "Dick", "Harry", "Anne", "Quinton", "Katie", "Mary"]; 
 

 
function findPotentialFriends(existingFriends) { 
 
    return function(x) { 
 
    return !existingFriends.some(function(elem) { 
 
     return elem === x; 
 
    }); 
 
    } 
 
} 
 

 
var isNotAFriend = findPotentialFriends(friends); 
 
console.log(isNotAFriend(allUsers[0]));

+1

Я думаю, что он действительно ищет является 'Array.some()'. – Barmar

+0

Да. Спасибо, я поменяю это. – theKidOfArcrania

0

Просто добавьте функцию return в map() .Its одной новой функции внутри функции обратного .so применяются с возвратом это тоже.

var friends = ["Tom", "Dick", "Harry"]; 
 
var secondLevelFriends = ["Anne", "Harry", "Quinton"]; 
 
var allUsers = ["Tom", "Dick", "Harry", "Anne", "Quinton", "Katie", "Mary"]; 
 

 
function findPotentialFriends(existingFriends) { 
 
    return function(x) { 
 
    return existingFriends.map(function(elem) { 
 
    if(elem === x) return false; 
 
    else return true; 
 
    }) 
 
    // for(var i = 0; i < existingFriends.length; i++) { 
 
    // if(existingFriends[i] === x) return false; 
 
    // else return true; 
 
    //} 
 
    } 
 
} 
 

 
var isNotAFriend = findPotentialFriends(friends); 
 
console.log(isNotAFriend(allUsers[0])); // false

1

Проблема с кодом является то, что return заявления в обратный вызов, просто вернитесь в map(), они не возвращаются к первоначальному абоненту. map() собирает все эти возвращаемые значения в массив и возвращает это, но вы ничего не делаете с результатом existingfriends.map().

Javascript имеет встроенную функцию для поиска массива для соответствующего элемента, Array.prototype.indexOf(). Он возвращает -1, если совпадение не найдено.

Таким образом, вы можете просто написать:

var friends = ["Tom", "Dick", "Harry"]; 
 
var secondLevelFriends = ["Anne", "Harry", "Quinton"]; 
 
var allUsers = ["Tom", "Dick", "Harry", "Anne", "Quinton", "Katie", "Mary"]; 
 

 
function findPotentialFriends(existingFriends) { 
 
    return function(x) { 
 
    return existingFriends.indexOf(x) == -1; 
 
    } 
 
} 
 

 
var isNotAFriend = findPotentialFriends(friends); 
 
console.log(isNotAFriend(allUsers[0])); // false

Смежные вопросы