我正在努力做到这一点。如果有人能帮我解决这个问题,我会很高兴的。
0: Object
Name: Ria
Age: 27
Sex: Female
1: Object
Name: Brian
Age: 23
Sex: Male
2: Object
Name: Rick
Age: 32
Sex: Male
这是对象数组。我正在传递用户输入的值。例如我要求用户输入名称。输入后,如果Name出现在对象数组中,我需要检查上面的对象数组。
我尝试了各种使用foreach,基本数组迭代的解决方案,但我找不到方法。
这是我在最后一次尝试的......
var result = false;
function search(nameKey, myArray) {
for (var i = 0; i < myArray.length; i++) {
if (myArray[i].Name === nameKey) {
return true;
}
}
}
result = search($scope.data.name, checkdatabase);
此处,checkdatabase
是对象数组,$scope.data.name
是用户输入的值。当用户出现在数据库中时,我期望结果的值为true
,否则结果为最初定义的false
。
答案 0 :(得分:1)
您需要的是Array.prototype.some
:
result = myArray.some(function(user) { return user.name === $scope.data.name; });
顺便说一句,这只是一个建议:我会存储一个用户名索引并使用Array.prototype.indexOf
。
每当您添加用户时,都可以将名称添加到数组中:
var userNameIndex = [];
var users = [];
users.push(user);
// I've called .toLowerCase() so the index isn't case sensitive
userNameIndex.push(user.Name.toLowerCase().trim());
...您可以按如下方式检查用户是否已添加:
// I've called .toLowerCase() to perform a case insensitive search
var result = userNameIndex.indexOf($scope.data.name.toLowerCase().trim()) > -1;
如果您要检索大量用户,它应该会表现得更好。
当用户出现时,我希望结果的值为true 数据库或结果为false,最初定义。
是的,但请注意,调用search
会再次设置变量result
。也就是说,永远不会保留初始false
。
答案 1 :(得分:0)
扩展Matias&#39;回答,some
对于工作来说非常棒,只要您不需要与谓词匹配的项目。 some
接受上下文作为第二个参数:
result = myArray.some(function(user) {
return user.name === this.name;
}, $scope.data); //pass $scope.data as this
如果您想跟踪与谓词匹配的项目,您有以下几种选择:创建索引对象或使用forEach
或while
var index = myArray.map(function(item) {
return item.name;
}).indexOf(nameKey);
var item = myArray[index];
var l = myArray.length;
var found = false;
while(!found && l--) {
found = myArray[l].name === nameKey;
}
var item = myArray[l];
答案 2 :(得分:0)
使用lodash.js。您可以使用给定参数过滤数组。
例如:
var givenJson ={ Name: Ria,Age: 27,Sex: Female};// this is the whole array
var response= _.filter(givenJson, function(data){
return data.name == "Ria";
});
if(response != null && response != undefined){
return true;
}