[英]Convert array of values to array of objects (key-value) pairs in 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")
一旦遇到一个匹配的元素,它就会被打断,并为您提供true
或false
您可以循环使用角度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.