Под подчеркиванием я могу успешно найти элемент с определенным значением ключа
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
но как мне узнать, в каком индексе массива находится этот объект?
javascript
underscore.js
Mheavers
источник
источник
findIndex
:var dataIndex = _.findIndex(tv, { id: voteID })
Ответы:
Я не знаю, существует ли существующий метод подчеркивания, который делает это, но вы можете добиться того же результата с помощью простого 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)]
источник
return -1;
по умолчанию?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
источник
index = _.findIndex(tv, {id: voteID})
будет работать, также работает, если вtv
коллекции есть более сложные значения (больше, чем простоid
свойство),Если вы хотите сохранить подчеркивание, чтобы ваша функция предиката была более гибкой, вот 2 идеи.
Способ 1
Поскольку предикат for
_.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
функцией, просто замените строкуresult = value;
наresult = index;
Это та же идея, что и в первом методе. Я добавил это, чтобы указать, что подчеркивание также использует побочный эффект для реализации_.find
.источник
Lo-Dash , который расширяет Underscore, имеет метод findIndex , который может найти индекс данного экземпляра, или по заданному предикату, или в соответствии со свойствами заданного объекта.
В вашем случае я бы сделал:
var index = _.findIndex(tv, { id: voteID });
Попробуйте.
источник
Если ваша целевая среда поддерживает ES2015 (или у вас есть шаг транспиляции, например, с Babel), вы можете использовать собственный Array.prototype.findIndex ().
Учитывая ваш пример
const array = [ {id:1}, {id:2} ] const desiredId = 2; const index = array.findIndex(obj => obj.id === desiredId);
источник
вы можете использовать
indexOf
метод изlodash
var tv = [{id:1},{id:2}] var voteID = 2; var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; }); var index=_.indexOf(tv,data);
источник
Держи это просто:
// 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)
источник
return parseInt(i) for i, x of array when cond(x)
Это поможет
lodash
пользователям. проверьте, присутствует ли ваш ключ, выполнив:hideSelectedCompany(yourKey) { return _.findIndex(yourArray, n => n === yourKey) === -1; }
источник
Самое простое решение - использовать lodash:
const _ = require ('lodash');
findIndexByElementKeyValue = (elementKeyValue) => { return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue); }
источник
Если вы ожидаете нескольких совпадений и, следовательно, вам нужно вернуть массив, попробуйте:
_.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);
источник
У меня был аналогичный случай, но наоборот - найти используемый ключ на основе индекса данного объекта. Я мог найти решение в подчеркивании, используя
Object.values
для возврата объекта в массив, чтобы получить произошедший индекс.var tv = {id1:1,id2:2}; var voteIndex = 1; console.log(_.findKey(tv, function(item) { return _.indexOf(Object.values(tv), item) == voteIndex; }));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
источник