2017-03-06 49 views
0

我是一名开发人员,对JavaScript速记方法知之甚少。用于检查对象数组中的特定键值的JavaScript快捷方式

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

假设我有对象的像

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

给出一个字符串“XYZ”的阵列,是否有任何的JavaScript /角的简写,而无需使用for循环,如果我的对象数组持有的名称返回true 'xyz'的价值。

我正在寻找速记表达式,类似indexOf函数。

任何帮助,非常感谢。

+3

'arr.some(O => 0 .name ===“xyz”)' – Andreas

+0

非常感谢你 – shreyansh

+0

你也可以使用 [查找功能](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/找到) –

回答

1

可以在预ES6使用

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

这是一个比较繁琐的版本,当然你可以提取你的函数有一个更可读/柔性版这样:

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 }) => ...:这是一个对象扩展表达式,它允许您根据属性名称轻松地将任何对象解构成其组件(或其组成部分)。
+0

非常感谢,很好的回答和ve很好解释。 – shreyansh

+0

我会避免使用过滤器,因为它会要求您检查整个阵列,以确保您每次最差情况下的性能(感兴趣的项目在数组的末尾) – mccainz

1

没有快速的简写,最短的,我认为最快的解决办法是使用Array.some

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

这会遇到一个匹配的元素,一旦中断,会给你要么truefalse

+0

非常感谢你 – shreyansh

+0

完美的用例为某些功能。方法简洁,阅读顺利,不需要任何东西。 – mccainz

1

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

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

它与for循环相同,它不是简写,只是它是异步循环。 – shreyansh

+0

一旦找到匹配,你应该“打破”循环。在那种情况下,它至少在功能上等同于“some”数组函数。这说明了只有在无法访问“某些”数组函数的情况下才能使用此方法。 – mccainz

0

如果你不能使用数组“一些”功能,那么你应该简单地构建一个基本的for循环和测试在其中。

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

所以,如果你不能使用“some”功能,那么接受一个基本的for循环,并尽快找到一个匹配。

0

另一种解决方案是使用array.findIndex。您可以创建功能检查与指定名称的元素的存在:

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

,然后使用它:

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

一下:https://jsfiddle.net/63ayto1w/1/

相关问题