Di garis bawah, saya berhasil menemukan item dengan nilai kunci tertentu
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
tetapi bagaimana cara menemukan indeks array objek yang terjadi?
javascript
underscore.js
mheavers
sumber
sumber
findIndex
:var dataIndex = _.findIndex(tv, { id: voteID })
Jawaban:
Saya tidak tahu apakah ada metode garis bawah yang melakukan ini, tetapi Anda dapat mencapai hasil yang sama dengan javascript biasa.
Array.prototype.getIndexBy = function (name, value) { for (var i = 0; i < this.length; i++) { if (this[i][name] == value) { return i; } } return -1; }
Kemudian Anda bisa melakukan:
var data = tv[tv.getIndexBy("id", 2)]
sumber
return -1;
default?findIndex
ditambahkan di 1.8:index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })
Lihat: http://underscorejs.org/#findIndex
Atau, ini juga berfungsi, jika Anda tidak keberatan membuat daftar sementara lainnya:
index = _.indexOf(_.pluck(tv, 'id'), voteId);
Lihat: http://underscorejs.org/#pluck
sumber
index = _.findIndex(tv, {id: voteID})
berfungsi, juga berfungsi jikatv
koleksi memiliki nilai yang lebih rumit (lebih dari sekadarid
properti)Jika Anda ingin tetap menggunakan garis bawah agar fungsi predikat Anda bisa lebih fleksibel, berikut 2 ide.
Metode 1
Karena predikat untuk
_.find
menerima nilai dan indeks elemen, Anda dapat menggunakan efek samping untuk mengambil indeks, seperti ini:var idx; _.find(tv, function(voteItem, voteIdx){ if(voteItem.id == voteID){ idx = voteIdx; return true;}; });
Metode 2
Melihat sumber garis bawah, inilah cara
_.find
implementasinya:_.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; };
Untuk membuat ini menjadi
findIndex
fungsi, cukup ganti barisresult = value;
denganresult = index;
Ini ide yang sama seperti metode pertama. Saya menyertakannya untuk menunjukkan bahwa garis bawah juga menggunakan efek samping untuk diterapkan_.find
.sumber
Lo-Dash , yang memperluas Underscore, memiliki metode findIndex , yang dapat menemukan indeks dari instance tertentu, atau dengan predikat tertentu, atau sesuai dengan properti objek tertentu.
Dalam kasus Anda, saya akan melakukan:
var index = _.findIndex(tv, { id: voteID });
Cobalah.
sumber
Jika lingkungan target Anda mendukung ES2015 (atau Anda memiliki langkah transpile, misalnya dengan Babel), Anda dapat menggunakan Array.prototype.findIndex () asli.
Berikan contoh Anda
const array = [ {id:1}, {id:2} ] const desiredId = 2; const index = array.findIndex(obj => obj.id === desiredId);
sumber
Anda dapat menggunakan
indexOf
metode darilodash
var tv = [{id:1},{id:2}] var voteID = 2; var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; }); var index=_.indexOf(tv,data);
sumber
Tetap sederhana:
// 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
Atau, untuk non-pembenci, varian CoffeeScript:
findIndex = (arr, cond) -> for i, x of arr return parseInt(i) if cond(x)
sumber
return parseInt(i) for i, x of array when cond(x)
Ini untuk membantu
lodash
pengguna. periksa apakah kunci Anda ada dengan melakukan:hideSelectedCompany(yourKey) { return _.findIndex(yourArray, n => n === yourKey) === -1; }
sumber
Solusi paling sederhana adalah dengan menggunakan lodash:
const _ = membutuhkan ('lodash');
findIndexByElementKeyValue = (elementKeyValue) => { return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue); }
sumber
Jika Anda mengharapkan beberapa kecocokan dan karenanya membutuhkan sebuah array untuk dikembalikan, coba:
_.where(Users, {age: 24})
Jika nilai properti unik dan Anda memerlukan indeks yang cocok, coba:
_.findWhere(Users, {_id: 10})
sumber
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);
sumber
Saya mendapat kasus serupa tetapi sebaliknya adalah menemukan kunci yang digunakan berdasarkan indeks objek tertentu. Saya dapat menemukan solusi dalam garis bawah menggunakan
Object.values
untuk mengembalikan objek ke dalam array untuk mendapatkan indeks yang terjadi.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>
sumber