我被赋予了创建基于对象的用户数组的任务。然后创建一个函数,该函数接收一个参数并返回另一个与第一个arr
中比较的值匹配的数组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"));
我能够匹配一个特定的用户名,但是如果我只是将j
输入matchName("j")
,我想返回两个对象。
对此的任何帮助都会很棒。 http://jsfiddle.net/dv9aq0m7/
感谢。
答案 0 :(得分:2)
您可以使用Array.prototype.filter
并返回符合条件的对象数组。像这样:
var users = [...];
function matchName(name) {
return users.filter(function (user) {
return user.firstname.indexOf(name) !== -1;
});
}
答案 1 :(得分:2)
您当前的代码会返回第一个完整匹配项。这段代码:
ar = [int(i) for i in raw_input().strip().split()]
检查两个字符串是否等于,然后return语句只返回该匹配的值。一旦返回任何值,该函数也会停止。
所以你需要做两个小改动。首先,您需要跟踪符合条件的所有用户,并且您应该使用不同的逻辑来检查string starts with another string。
修改后的代码可能如下所示:
if(users[i].firstname == name) {
return users[i];
}
注意:根据您正在打印的文本,我通过检查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;
}
数组中的元素数量,移动了打印逻辑,表明在循环外没有找到用户。只有在没有匹配的用户时才会打印一次。
答案 2 :(得分: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;
});
}
这总是返回一个数组,我认为这是一个更好的界面。
答案 3 :(得分:0)
使用Array.prototype.filter()
。您的方法只会将第一场比赛作为对象返回。
function matchName(name) {
return users.filter(function (item) {
return item.firstname == name
}
}
然后使用结果的length
来测试匹配是否存在
答案 4 :(得分:0)
您可以使用regular expressions来匹配您姓名的任何部分,而不仅仅是开始。
width