2015-04-30 4 views
2

Мне была задана задача создать массив объектов на основе объектов. Затем создать аа функции, которая принимает в качестве параметра и возвращает другой массив, соответствующие значения по сравнению в пределах первого обраСоответствует значению из массива и возвращает другой массив из функции

var users = [ 
    { 
    firstname : "jetlag", 
    lastname: "son" 
    }, 
    { 
    firstname : "becky", 
    lastname: "love" 
    }, 
    { 
    firstname : "just", 
    lastname: "me" 
    } 
]; 

function matchName(name) { 
    for (var i = 0; i < users.length; i++) { 
     if(users[i].firstname == name) { 
      return users[i]; 
     } else { 
      console.log('user does not exist') 
     } 
    } 
} 

console.log(matchName("jetlag")); 

Я могу соответствовать specfic имени пользователя, но что, если я просто ввести j в matchName("j"), я бы как вернуть два объекта.

Любая помощь по этому вопросу будет замечательной. http://jsfiddle.net/dv9aq0m7/

Спасибо.

+0

регулярные выражения? http://www.w3schools.com/jsref/jsref_obj_regexp.asp –

ответ

2

Ваш текущий код возвращает первое полное совпадение. Этот код:

if(users[i].firstname == name) { 
     return users[i]; 
    } 

проверяет, что две строки равной и тогда оператор возврата будет возвращать только что согласованного значения. Функция также останавливается, как только она возвращает какое-либо значение.

Итак, вам нужно внести две небольшие изменения. Сначала вам нужно отслеживать всех пользователей, которые соответствуют критериям, и вы должны использовать другую логику, чтобы проверить, что string starts with another string.

Revised код может выглядеть следующим образом:

function matchName(name) { 
    var validUsers = [];      //the array of users that pass the logic 
    for (var i = 0; i < users.length; i++) { 
     if(users[i].firstname.lastIndexOf(name) === 0) { //this is "starts with" logic 
      validUsers.push(users[i]);   //add the element if it's valid 
     } 
    } 
    //I moved the logic for no matching users the outside the loop 
    if (validUsers.length === 0) 
     console.log('No matching users found') 
    return validUsers; 
} 

Примечание: На основе текста, который вы печатали, я переехал логику для печати, что ни один пользователь не были найдены за пределами цикла, проверяя количество элементов в validUsers массив. Это будет печататься один раз, только если нет соответствующих пользователей.

Вот fork to your fiddle

+0

Выглядит отлично, я бы просто ослабил 'break;' после показа пользователь не существует ошибки, поэтому он не печатает этот оператор три раза. Благодаря! – Shivam

+0

@Shivam обновлен на основе текста этого консольного журнала. – ryanyuyu

2

Вы можете использовать Array.prototype.filter и возвращать массив объектов, соответствующих вашим критериям. Что-то вроде этого:

var users = [...]; 
function matchName(name) { 
    return users.filter(function (user) { 
     return user.firstname.indexOf(name) !== -1; 
    }); 
} 
0

Для этого используйте Array.prototype.filter(). Ваш подход будет возвращать только первое совпадение в качестве объекта.

function matchName(name) { 
    return users.filter(function (item) { 
     return item.firstname == name 
    } 
} 

Затем используйте length результата, чтобы проверить, если матчи существуют

1

Итак, вы хотите, чтобы сравнить префикс, а не равенство.

Вы можете использовать

users[i].firstname.indexOf(name) === 0 

, чтобы проверить, если user.firstname начинается с name.

и использовать filtering для извлечения совпадений:

function matchName (name) { 
    return users.filter(function (user) { 
     return user.firstname.indexOf(name) === 0; 
    }); 
} 

Это всегда возвращает массив, который я думаю, это лучший интерфейс.

0

Вы можете использовать regular expressions для того, чтобы соответствовать любой части вашего имени, а не только самого начало.

function matchName(name) { 
    var pattern = new RegEx(name, "i"); 
    for (var i = 0; i < users.length; i++) { 
     if(users[i].firstname.search(pattern)) { 
      return users[i]; 
     } else { 
      console.log('user does not exist') 
     } 
    } 
} 
Смежные вопросы