find具有下划线中特定键值的对象的数组索引

在下划线中,我可以成功find具有特定键值的项目

var tv = [{id:1},{id:2}] var voteID = 2; var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; }); //data = { id: 2 } 

但我怎么find什么数组索引该对象发生在?

我不知道是否有一个现有的下划线方法,但你可以用普通的javascript实现相同的结果。

 Array.prototype.getIndexBy = function (name, value) { for (var i = 0; i < this.length; i++) { if (this[i][name] == value) { return i; } } return -1; } 

那么你可以做:

var data = tv[tv.getIndexBy("id", 2)]

findIndex被添加到1.8:

 index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID }) 

请参阅: http : //underscorejs.org/#findIndex

另外,如果你不介意做另一个临时列表,这也是有效的。

 index = _.indexOf(_.pluck(tv, 'id'), voteId); 

见: http : //underscorejs.org/#pluck

如果你想保持下划线,所以你的谓词函数可以更灵活,这里有两个想法。

方法1

由于_.find的谓词_.find接收元素的值和索引,因此可以使用副作用来检索索引,如下所示:

 var idx; _.find(tv, function(voteItem, voteIdx){ if(voteItem.id == voteID){ idx = voteIdx; return true;}; }); 

方法2

看下划线的来源,这是如何实现_.find

 _.find = _.detect = function(obj, predicate, context) { var result; any(obj, function(value, index, list) { if (predicate.call(context, value, index, list)) { result = value; return true; } }); return result; }; 

为了使其成为findIndex函数,只需replace行result = value; result = index; 这和第一种方法是一样的。 我将其包含在内,指出下划线使用副作用来实现_.find

Lo-Dash扩展了Underscore ,它有findIndex方法,它可以find给定实例的索引,给定的谓词,或者根据给定对象的属性。

就你而言,我会做:

 var index = _.findIndex(tv, { id: voteID }); 

试一试。

如果你的目标环境支持ES2015(或者你有一个transpile步骤,例如Babel),你可以使用本地的Array.prototype.findIndex()。

给你的例子

 const array = [ {id:1}, {id:2} ] const desiredId = 2; const index = array.findIndex(obj => obj.id === desiredId); 

保持简单:

 // Find the index of the first element in array // meeting specified condition. // var findIndex = function(arr, cond) { var i, x; for (i in arr) { x = arr[i]; if (cond(x)) return parseInt(i); } }; var idIsTwo = function(x) { return x.id == 2 } var tv = [ {id: 1}, {id: 2} ] var i = findIndex(tv, idIsTwo) // 1 

或者,对于非憎恨者,CoffeeScript变体:

 findIndex = (arr, cond) -> for i, x of arr return parseInt(i) if cond(x) 

你可以使用lodash indexOf方法

 var tv = [{id:1},{id:2}] var voteID = 2; var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; }); var index=_.indexOf(tv,data); 

如果你期待多个匹配,因此需要返回一个数组,请尝试:

 _.where(Users, {age: 24}) 

如果属性值是唯一的,并且您需要匹配的索引,请尝试:

 _.findWhere(Users, {_id: 10}) 
 Array.prototype.getIndex = function (obj) { for (var i = 0; i < this.length; i++) { if (this[i][Id] == obj.Id) { return i; } } return -1; } List.getIndex(obj);