【问题标题】:Find if values exists in an array of object (Angularjs) [closed]查找对象数组中是否存在值(Angularjs)[关闭]
【发布时间】:2016-06-21 15:53:28
【问题描述】:

我很难做到这一点。如果有人可以帮助我找到解决方案,我会很高兴。

0: Object
   Name: Ria
   Age: 27
   Sex: Female

1: Object
   Name: Brian
   Age: 23
   Sex: Male

2: Object
   Name: Rick
   Age: 32
   Sex: Male

这里是对象数组。我正在传递用户输入的值。例如我要求用户输入名称。输入后,如果名称存在于对象数组中,我需要检查上述对象数组。

我使用 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

【问题讨论】:

  • 您正在检查myArray[i].User_ID,但您的对象没有User_ID 属性。您可能想查看myArray[i].Name
  • 对不起。更正了 tat 属性。
  • 只需在函数末尾添加return false;
  • @AlonEitan 为什么?默认情况下,它会返回 undefined 这是虚假的。
  • @MikeC 哦,在那种情况下,我只是不明白这个问题。 result = false 超出了函数的范围,这就是我感到困惑的原因。谢谢

标签: javascript arrays angularjs object iteration


【解决方案1】:

使用 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;
}

【讨论】:

  • 这很可悲。当过滤多年来一直是数组原型的一部分时,您建议使用一个库....
  • @MatíasFidemraizer colintoh.com/blog/….
  • 我相信你没有理解我之前的评论......我告诉你,多年来有很多数组函数是 ECMA-Script 5.x 标准的一部分,@ 987654323@ 已经在 vanilla javascript 中了。您关于使用 lodash 的建议不会为已发布的答案提供更多价值...
【解决方案2】:

为了扩展 Matias 的答案,some 非常适合这项工作,只要您不需要与您的谓词匹配的项目。 some 接受上下文作为第二个参数:

result = myArray.some(function(user) { 
  return user.name === this.name; 
}, $scope.data); //pass $scope.data as this

如果您想跟踪与谓词匹配的项目,您有多种选择:创建索引对象或使用forEachwhile 遍历数组

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];

【讨论】:

  • 马蒂亚斯 :D 不是马蒂亚斯!!
【解决方案3】:

你需要的是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;

如果您要检索大量用户,它应该会表现得更好。

当用户出现在 数据库,否则结果为最初定义的 false。

是的,但请注意,调用 search 会再次设置变量 result。也就是说,最初的false 永远不会被保留。

【讨论】:

  • 这确实和他自己的解决方案没有什么不同,所以很明显肯定有其他问题。
  • @Comptonburger 你确定吗?返回false 和返回undefined 不一样,是吗?
  • 作者在cmets中指出,他不在乎返回falseundefined。他的问题几乎可以肯定还有其他问题,因此这不是答案。
  • @Comptonburger 由于我们不了解有关实际问题的更多详细信息,我想说使用布尔值比依赖 undefined 作为 false 更好。检查 OP 是否使用 === 而不是 ==。试想一下,如果 OP 也在绑定上使用 ===
  • @Comptonburger 另一方面,我找不到 OP 说他/她根本不关心结果的地方............
猜你喜欢
  • 2017-03-22
  • 2017-03-09
  • 2023-02-03
  • 2016-12-24
  • 2016-06-09
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多