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);