temukan indeks larik dari suatu objek dengan nilai kunci tertentu di garis bawah

91

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?

mheavers
sumber
Terima kasih - ini berguna - tetapi dalam contoh yang tercantum Anda sedang mencari satu nomor dalam array angka - Saya mencari nilai kunci dalam array objek. Akankah fungsi ini mengakomodasi itu?
mheavers
2
Apakah itu tes numerik atau predikat kesetaraan properti Anda tidak masalah, ya.
Bergi
Coba findIndex:var dataIndex = _.findIndex(tv, { id: voteID })
Tom Söderlund
Harap pertimbangkan untuk menerima jawaban yang memberikan solusi Garis Bawah , seperti yang diminta dalam pertanyaan.
Nigel B. Peck

Jawaban:

28

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

tewathia
sumber
4
Mengapa tidak secara return -1;default?
Radu Chiriac
171

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

Ropez
sumber
Saya tidak yakin tentang garis bawah tetapi di lodash Anda tidak memerlukan fungsi anonim, cukup index = _.findIndex(tv, {id: voteID})berfungsi, juga berfungsi jika tvkoleksi memiliki nilai yang lebih rumit (lebih dari sekadar idproperti)
Scott Jungwirth
1
Satu poin menggunakan pemetikan jauh lebih lambat. Saya karena lintasan ekstra nya. jsperf.com/compare-find-index
Farshid Saberi
38

Jika Anda ingin tetap menggunakan garis bawah agar fungsi predikat Anda bisa lebih fleksibel, berikut 2 ide.

Metode 1

Karena predikat untuk _.findmenerima 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 _.findimplementasinya:

_.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 findIndexfungsi, cukup ganti baris result = value;dengan result = index;Ini ide yang sama seperti metode pertama. Saya menyertakannya untuk menunjukkan bahwa garis bawah juga menggunakan efek samping untuk diterapkan _.find.

lastoneisbearfood
sumber
37

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.

splintor
sumber
findIntex ini adalah metode dari lo-dash, bukan dari garis bawah
Wallysson Nunes
4
@WallyssonNunes Ini persis seperti yang saya tulis - "Lo-Dash, yang memperluas Underscore, memiliki metode findIndex"
splintor
3
Ini sekarang menjadi bagian dari pustaka garis bawah standar, mulai dari versi 1.8.0: underscorejs.org/#1.8.0
Gage Trader
10

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);
craigmichaelmartin
sumber
4

Anda dapat menggunakan indexOfmetode 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);
Amil Sajeev
sumber
3

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)
joyrexus.dll
sumber
1
lebih baikreturn parseInt(i) for i, x of array when cond(x)
meagar
1
bagaimana ini sederhana dari jawaban sebelumnya ??
ncubica
2

Ini untuk membantu lodashpengguna. periksa apakah kunci Anda ada dengan melakukan:

hideSelectedCompany(yourKey) {
 return _.findIndex(yourArray, n => n === yourKey) === -1;
}
Syed
sumber
1

Solusi paling sederhana adalah dengan menggunakan lodash:

  1. Pasang lodash:

npm install --save lodash

  1. Gunakan metode findIndex:

const _ = membutuhkan ('lodash');

findIndexByElementKeyValue = (elementKeyValue) => {
  return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue);
}
Jackkobec
sumber
0

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})
Ketan
sumber
0
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);
Chinna Amara
sumber
0

Saya mendapat kasus serupa tetapi sebaliknya adalah menemukan kunci yang digunakan berdasarkan indeks objek tertentu. Saya dapat menemukan solusi dalam garis bawah menggunakan Object.valuesuntuk 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>

Chetabahana
sumber