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")
一旦遇到一个匹配元素就会中断,并且会给你 true
或 false
您可以使用 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
我是 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")
一旦遇到一个匹配元素就会中断,并且会给你 true
或 false
您可以使用 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