我是角色开发人员,对JavaScript简写方法不太了解。
我遇到过需要在JavaScript中循环使用for循环的情况。
假设我有一个像
这样的对象数组var arr = [{name:'abc', val:1}, {name:'xyz', val:2}, ....];
给定一个字符串'xyz',如果我的对象数组名称为'xyz'值,是否有任何JavaScript / Angular速记而不使用for循环返回true。
我正在寻找简写表达式,例如indexOf
函数。
非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用
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; }
< / strong>) - 不同之处在于箭头函数变体中的this
与函数变体中的this
不同。({ name }) => ...
:这是一个对象扩展表达式,允许您根据属性名称轻松地将任何对象解构为其组件(或其组件的一部分)。答案 1 :(得分:1)
没有快速简写,最短且我认为最快的解决方案是使用Array.some
var hasName = arr.some(o => o.name === "xyz")
一旦遇到一个匹配的元素就会被中断,并会给你true
或false
答案 2 :(得分:1)
您可以使用angular forEach函数进行循环搜索。
var matchingIndex = -1;
angular.forEach($scope.data, function(item, itemIndex) {
if(item.name === "xyz"){
matchingIndex = itemIndex;
}
});
console.log(matchingIndex);
答案 3 :(得分:0)
如果你不能使用数组“some”函数那么你应该简单地构造一个基本的for循环并在其中进行测试。
避免使用诸如“forEach”或“filter”之类的数组函数,因为它们将要求您检查整个数组,从而保证每次最坏情况下的性能,即使感兴趣的项目位于数组的开头。 “过滤器”的“forEach”短路将要求你做一些丑陋的事情,例如在try-catch块中包装函数调用,然后在找到匹配项后抛出(不要这样做)。
所以,如果你不能使用“some”函数,那么只要你找到一个匹配就接受一个基本的for循环并中断。
答案 4 :(得分:0)
另一种解决方案是使用array.findIndex
。您可以创建检查具有指定名称的元素是否存在的函数:
const findByName = (name) => arr.findIndex(elem => elem.name === 'xyz') > -1;
然后使用它:
findByName('xyz') // true
findByName('wrongName') // false