繁体   English   中英

JavaScript快捷方式,用于检查对象数组中的特定键值

[英]JavaScript shortcut for checking a particular key-value inside array of objects

我是开发人员,对JavaScript速记方法不太了解。

我遇到了需要在JavaScript中使用for循环进行循环的情况。

假设我有一个像这样的对象数组

var arr = [{name:'abc', val:1}, {name:'xyz', val:2}, ....];

给定字符串“ xyz”,如果我的对象数组将名称保留为“ xyz”值,那么是否有任何JavaScript / Angular速记形式而不使用for循环返回true。

我正在寻找一种简写形式的表达式,如indexOf函数。

任何帮助是极大的赞赏。

您可以使用

if (arr.filter(function(x) { return x.name === 'xyz'; }).length > 0) { ... }

在ES6之前的版本中。

这是一个比较麻烦的版本,当然您可以提取函数以使其具有更高的可读性/灵活性,例如:

function equaling(attr, value) { 
  return function(obj) {
    return (obj || {})[attr] === value; 
  };
}

if (arr.filter(equaling('name', 'xyz')).length > 0) { ... }

您也可以使用

if (arr.some(({ name }) => name === 'xyz')) { ... }

与ES6 / ES2015。 基本上,这利用了最新的语言功能,并且无需创建自己的功能即可读取,表达和维护。

提到的功能是:

  • (value) => expression :这是一个箭头函数(简写)定义函数文本的等效,其结果是靠近在ES5函数定义( function(value) { return expression; } -不同的是, this在箭头功能变体与this功能变体中的箭头变体不同。
  • ({ name }) => ... :这是一个对象扩展表达式,使您可以根据属性名称轻松地将任何对象分解为它的组件(或其组件的一部分)。

没有捷径,最短,我认为最快的解决方案是使用Array.some

var hasName = arr.some(o => o.name === "xyz")

一旦遇到一个匹配的元素,它就会被打断,并为您提供truefalse

您可以循环使用角度forEach函数进行搜索。

var matchingIndex = -1;
angular.forEach($scope.data, function(item, itemIndex) {
   if(item.name === "xyz"){
      matchingIndex = itemIndex;
   }
});
console.log(matchingIndex);

如果您不能使用数组“ some”函数,则应该简单地构造一个基本的for循环并在其中进行测试。

避免使用诸如“ forEach”或“ filter”之类的数组函数,因为它们将要求您检查整个数组,从而即使在您感兴趣的项目位于数组的开头时,也要保证每次都具有最差的性能。 短路“过滤器”的“ forEach”将要求您做一些丑陋的事情,例如将函数调用包装在try-catch块中,然后在找到匹配项后抛出(不要这样做)。

因此,如果您不能使用“ some”功能,则在找到匹配项后立即接受基本的for循环并中断。

另一种解决方案是使用array.findIndex 您可以创建函数来检查具有指定名称的元素的存在:

const findByName = (name) => arr.findIndex(elem => elem.name === 'xyz') > -1;

然后使用它:

findByName('xyz')  // true
findByName('wrongName')  // false

检查它: https : //jsfiddle.net/63ayto1w/1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM