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

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

我是 angular 开发人员,对 JavaScript shorthand 方法了解不多。

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

假设我有一个像

这样的对象数组
var arr = [{name:'abc', val:1}, {name:'xyz', val:2}, ....];

给定一个字符串 'xyz',如果我的对象数组的名称为 [=25=,是否有任何 JavaScript/Angular shorthand 不使用 for 循环到 return true ]值。

我正在寻找一个 shorthand 表达式,类似于 indexOf 函数。

非常感谢任何帮助。

您可以使用

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

在 ES6 之前。

这是一个更麻烦的版本,当然您可以提取您的函数以获得更多 readable/flexible 版本:

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:这是一个箭头函数(shorthand)等价于定义函数字面量,结果接近于ES5中的函数定义( function(value) { return expression; }) - 区别在于箭头函数变体中的 this 与函数变体中的 this 不同。
  • ({ name }) => ...:这是一个对象展开表达式,允许您根据属性轻松地将任何对象分解为其组件(或其组件的一部分)名字。

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

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

一旦遇到一个匹配元素就会中断,并且会给你 truefalse

您可以使用 angular forEach 函数循环搜索它。

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

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

避免使用 "forEach" 或 "filter" 等数组函数,因为它们会要求您检查整个数组,从而保证每次都在最坏情况下的性能,即使感兴趣的项目位于你的阵列的开始。将 "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/