Bagaimana cara mendapatkan elemen pertama array?

236

Bagaimana Anda mendapatkan elemen pertama dari array seperti ini:

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

Saya mencoba ini:

alert($(ary).first());

Tapi itu akan kembali [object Object]. Jadi saya perlu mendapatkan elemen pertama dari array yang seharusnya menjadi elemen 'first'.

MacMac
sumber
2
Saya sangat menyarankan untuk menyortir jawaban dengan aktif
leonheess

Jawaban:

338

seperti ini

alert(ary[0])
John Hartsock
sumber
35
var a = []; a[7] = 'foo'; alert(a[0]);
Petah
72
Ini mengasumsikan bahwa elemen pertama dalam array selalu memiliki indeks 0. Anda tahu apa yang mereka katakan tentang asumsi ...
Andy
16
@Andy Tidak ada asumsi, karena pertanyaan OP cukup jelas dan spesifik.
John Hartsock
5
@ Petah tidak ada yang salah dengan kode itu. Ini hanya menunjukkan tidak terdefinisi, karena itulah nilai [0], yang sebenarnya merupakan item pertama dalam array. Jika Anda ingin menampilkan foo, Anda harus melewati semua nilai yang tidak ditentukan tetapi itu tidak akan menjadi item pertama dalam array.
Michiel van der Blonk
5
@MichielvanderBlonk Saya hanya menunjukkan kasus tepi yang mungkin tidak diharapkan beberapa pengguna.
Petah
92

Beberapa cara di bawah ini untuk keadaan yang berbeda.

Dalam kebanyakan kasus normal, cara paling sederhana untuk mengakses elemen pertama adalah dengan

yourArray[0]

tetapi ini mengharuskan Anda untuk memeriksa apakah [0] benar-benar ada.

Ada kasus dunia nyata di mana Anda tidak peduli dengan array asli, dan tidak ingin memeriksa apakah indeks ada, Anda hanya ingin mendapatkan elemen pertama atau inline yang tidak ditentukan.

Dalam hal ini, Anda bisa menggunakan metode shift () untuk mendapatkan elemen pertama, tetapi berhati-hatilah karena metode ini memodifikasi array asli (menghapus item pertama dan mengembalikannya). Oleh karena itu panjang array dikurangi satu. Metode ini dapat digunakan dalam kasus inline di mana Anda hanya perlu mendapatkan elemen pertama, tetapi Anda tidak peduli dengan array asli.

yourArray.shift()

Yang penting untuk diketahui adalah bahwa keduanya di atas hanya opsi jika array Anda mulai dengan indeks [0].

Ada kasus-kasus di mana elemen pertama telah dihapus, misalnya dengan, hapus yourrray [0] meninggalkan array Anda dengan "lubang". Sekarang elemen di [0] tidak ditentukan, tetapi Anda ingin mendapatkan elemen "yang ada" pertama. Saya telah melihat banyak kasus dunia nyata ini.

Jadi, dengan asumsi kita tidak memiliki pengetahuan tentang array dan kunci pertama (atau kita tahu ada lubang), kita masih bisa mendapatkan elemen pertama.

Anda dapat menggunakan find () untuk mendapatkan elemen pertama.

Keuntungan dari find () adalah efisiensinya ketika keluar dari loop ketika nilai pertama yang memenuhi kondisi tercapai (lebih lanjut tentang ini di bawah). (Anda dapat menyesuaikan kondisi untuk mengecualikan nol atau nilai kosong lainnya juga)

var firstItem = yourArray.find(x=>x!==undefined);

Saya juga ingin memasukkan filter () di sini sebagai opsi untuk pertama "memperbaiki" array dalam salinan dan kemudian mendapatkan elemen pertama sambil tetap mempertahankan array asli (tidak dimodifikasi).

Alasan lain untuk memasukkan filter () di sini adalah bahwa ada sebelum find () dan banyak programmer telah menggunakannya (itu ES5 terhadap find () menjadi ES6).

var firstItem = yourArray.filter(x => typeof x!==undefined).shift();

Peringatan bahwa filter () sebenarnya bukan cara yang efisien (filter () menjalankan semua elemen) dan membuat array lain. Baik untuk digunakan pada array kecil karena dampak kinerja akan marjinal, lebih dekat dengan menggunakan forEach, misalnya.

(Saya melihat beberapa orang menyarankan untuk menggunakan ... di loop untuk mendapatkan elemen pertama, tapi saya akan merekomendasikan terhadap metode ini untuk ... di tidak boleh digunakan untuk beralih pada Array di mana urutan indeks penting karena urutannya tidak penting . t menjamin pesanan meskipun Anda dapat berdebat browser sebagian besar menghormati pesanan. Namun, karena setiap orang tidak memecahkan masalah karena banyak yang menyarankan karena Anda tidak bisa memecahkannya dan itu akan berjalan melalui semua elemen. Anda akan lebih baik menggunakan sederhana untuk lingkaran dan dengan memeriksa kunci / nilai

Baik find () dan filter () menjamin urutan elemen, jadi aman digunakan seperti di atas.

Selay
sumber
1
Mengapa tidak menghapuskan array setelahnya, misalnya: var element = yourArray.shift (); yourArray.unshift (elemen);
Greg
9
Karena itu hal yang sangat tidak efisien dan buruk. Anda bisa mendapatkan elemen pertama dengan cara yang jauh lebih efisien. Baik shift maupun unshift melakukan beberapa pengecekan dan melintasi seluruh array untuk mencapai tugas karena ketika Anda menghapus atau menambahkan elemen baru ke awal, semua indeks lainnya harus digeser. Sepertinya Anda memiliki bus yang penuh dengan orang, dan ketika seseorang dari kursi belakang ingin turun, Anda mengosongkan bus melalui pintu depan dan kemudian meminta mereka naik lagi.
Selay
1
@Selay itu tergantung pada internal juru bahasa tertentu.
Michiel van der Blonk
@Michiel van der Blonk Bisakah Anda memberi tahu saya penerjemah mana yang melakukannya seperti yang Anda sebutkan. Aku sangat tertarik. Semua implementasi yang saya kenal menggunakan loop dan salin. Ini adalah cara kerja array JavaScript. Anda tidak bisa begitu saja menghapus elemen pertama dengan mudah karena array yang tersisa sekarang dimulai dari 1 (elemen pada posisi 0 dihapus), yang perlu Anda perbaiki. Anda tidak dapat membuat keajaiban terlepas dari implementasi internal apa yang Anda miliki.
Selay
Jika Anda menggunakannya yourArray.map(n=>n).shift()akan mengembalikan item pertama tanpa mengubah yang asli ... tidak tahu apakah itu cara terbaik tetapi jika Anda rantai array dengan .map (). Filter (). Some (). Shift () tidak apa-apa .. kalau tidak saya akan menggunakanyourArray[0]
Michael J. Zoidl
53

Menggunakan destruksi ES6

let [first] = [1,2,3];

Yang sama dengan

let first = [1,2,3][0];
Flavien Volken
sumber
Mungkin relevan untuk menambahkan bahwa Destructing hanya opsi jika array Anda dimulai dengan indeks [0].
leonheess
53

Elemen indeks 0 mungkin tidak ada jika elemen pertama telah dihapus:

let a = ['a', 'b', 'c'];
delete a[0];

for (let i in a) {
  console.log(i + ' ' + a[i]);
}

Cara yang lebih baik untuk mendapatkan elemen pertama tanpa jQuery:

function first(p) {
  for (let i in p) return p[i];
}

console.log( first(['a', 'b', 'c']) );

NicoLwk
sumber
1
a.entries () [0] harus melakukannya :)
Edson Medina
1
Itu karena Anda seharusnya tidak menggunakan enumerasi semacam itu dengan array, karena itu menghitung objek dan bukan anggota array. Gunakan pengindeksan dengan tradisional untuk loop.
Oskar Duveborn
Pendekatan ES6 serupa (juga tidak mengandalkan indeks numerik) di sini: stackoverflow.com/a/56115413/7910454
leonheess
46

Jika Anda ingin mempertahankan readibility Anda selalu dapat menambahkan fungsi pertama ke Array.protoype:

Array.prototype.first = function () {
    return this[0];
};

A maka Anda dapat dengan mudah mengambil elemen pertama:

[1, 2, 3].first();
> 1
eliocs
sumber
14
itu dianggap sebagai praktik yang sangat buruk untuk bermain-main dengan prototipe kelas dasar dengan cara apa pun untuk alasan yang baik.
Dmitry Matveev
11
itu konyol, bagaimana mengetik .first()lebih baik daripada melakukan [0]?
jonschlinkert
10
@jonschlinkert Beberapa bahasa memiliki indeks yang dimulai dengan 1. firsttidak ambigu dalam hal itu.
Bartek Banachewicz
6
apa yang dikembalikan [] .first ()?
Rhyous
1
Dalam pengujian saya mengembalikan tidak terdefinisi. Saya mencoba untuk memutuskan apakah saya suka kembali tidak terdefinisi.
Rhyous
33

Anda bisa menggunakan find():

let first = array.find(Boolean);

Atau jika Anda ingin elemen pertama bahkan jika itu adalah falsy :

let first = array.find(e => true);

Bekerja lebih keras:

Jika Anda peduli tentang keterbacaan tetapi tidak ingin bergantung pada insiden numerik, Anda dapat menambahkan first()-fungsi Array.protoypedengan mendefinisikannya dengan Object​.define​Property()yang mengurangi perangkap memodifikasi prototipe objek Array bawaan secara langsung ( dijelaskan di sini ).

Kinerja cukup bagus ( find()berhenti setelah elemen pertama) tetapi tidak sempurna atau dapat diakses secara universal (hanya ES6). Untuk latar belakang lebih lanjut baca jawaban @Selays .

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(e => true);     // or this.find(Boolean)
  }
});

Kemudian untuk mengambil elemen pertama yang dapat Anda lakukan:

let array = ['a', 'b', 'c'];
array.first();

> 'a'

Cuplikan untuk melihatnya beraksi:

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(Boolean);
  }
});

console.log( ['a', 'b', 'c'].first() );

kesendirian
sumber
3
Ini adalah jawaban terbaik dan terbaru. Saya akan memposting di sini sama, tetapi setelah saya melihat milik Anda :)
Kostanos
Dan apa yang terjadi jika dalam versi bahasa yang akan datang mereka akan menambahkan find ()? :-) bukankah potongan di atas akan merusaknya?
Bogdan
@ Bogdan Apa maksud Anda saat mereka akan menambahkanfind() ? find()telah lama menjadi bagian dari bahasa tersebut. Itulah alasan mengapa cuplikan di atas berfungsi.
leonheess
Ohh Maaf sedikit lelah belum tidur banyak yang saya maksudkan dulu.
Bogdan
@Bogdan Itu masih akan bekerja dengan baik tetapi menimpa potensi masa depan first()
-metode
18

Jika array Anda tidak dijamin terisi dari indeks nol, Anda dapat menggunakan Array.prototype.find():

var elements = []
elements[1] = 'foo'
elements[2] = 'bar'

var first = function(element) { return !!element }    
var gotcha = elements.find(first)

console.log(a[0]) // undefined
console.log(gotcha) // 'foo'
thomax
sumber
3
Ini harus benar-benar dipilih lebih tinggi. Ini solusi paling ringkas yang saya lihat yang menggunakan vanilla js dan akun untuk array jarang.
Dominic P
Tidak akan bekerja di IE11: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Corey Alix
1
Saya akan menyarankan agar tidak menggunakan !!elementkarena akan melewati nilai-nilai palsu. Saya akan merekomendasikan menggunakan find()cara ini:sparse.find((_, index, array) => index in array);
Victor Welling
Pendekatan serupa tanpa mengabaikan nilai
falsy di
13
array.find(e => !!e);  // return the first element 

karena "temukan" kembalikan elemen pertama yang cocok dengan filter && !!ecocok dengan elemen apa pun.

Catatan ini bekerja hanya ketika elemen pertama bukanlah "falsy": null, false, NaN, "", 0,undefined

Abdennour TOUMI
sumber
1
Abdennour untuk mengklarifikasi kepada orang lain kondisi Anda cocok dengan elemen kebenaran apa pun, yaitu <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = example.find (e => !! e); // berikan elemen ke-5, non falsy pertama: {} </code>
PDA
Terima kasih @PDA untuk mengejar ketinggalan. BTW, string kosong dianggap juga falsy
Abdennour TOUMI
3
ini bagus dan juga berfungsi dengan baik di TypeScript. Bagaimana dengan penyederhanaan array.find(() => true);? Ini memungkinkan Anda melakukannya [false].find(() => true)juga.
Simon Warta
@SimonWarta tentu saja .find(value => true)hanya berfungsi seperti yang diharapkan ... tetapi jujur ​​jika Anda menginginkan kode yang lebih bersih dan untuk tetap mengetikkan naskah, gunakan perusakan .
Flavien Volken
Lihat jawaban ini untuk cara yang sama tanpa jebakan mengabaikan elemen palsu
leonheess
9

Coba alert(ary[0]);.

thejh
sumber
1
Lihat jawaban ini tentang mengapa solusi ini tidak selalu berhasil.
Gustavo Straube
7

Saya tahu bahwa orang-orang yang datang dari bahasa lain ke JavaScript, mencari sesuatu seperti head()atau first()untuk mendapatkan elemen pertama dari sebuah array, tetapi bagaimana Anda bisa melakukannya?

Bayangkan Anda memiliki array di bawah ini:

const arr = [1, 2, 3, 4, 5];

Dalam JavaScript, Anda cukup melakukan:

const first = arr[0];

atau yang lebih rapi, cara yang lebih baru adalah:

const [first] = arr;

Tetapi Anda juga bisa menulis fungsi seperti ...

function first(arr) {
   if(!Array.isArray(arr)) return;
   return arr[0];
}

Jika menggunakan garis bawah, ada daftar fungsi yang melakukan hal yang sama seperti yang Anda cari:

_.first 

_.head

_.take
Alireza
sumber
6

Metode yang bekerja dengan array , dan bekerja dengan objek juga (waspadalah, objek tidak memiliki urutan yang dijamin!).

Saya lebih suka metode ini, karena array asli tidak dimodifikasi.

// In case of array
var arr = [];
arr[3] = 'first';
arr[7] = 'last';
var firstElement;
for(var i in arr){
    firstElement = arr[i];
    break;
}
console.log(firstElement);  // "first"

// In case of object
var obj = {
    first: 'first',
    last: 'last',
};

var firstElement;

for(var i in obj){
    firstElement = obj[i];
    break;
}

console.log(firstElement) // First;
Mārtiņš Briedis
sumber
5

Di ES2015 dan di atasnya, menggunakan destructure array:

const arr = [42, 555, 666, 777]
const [first] = arr
console.log(first)

Vik
sumber
Itu jawaban yang sama dengan stackoverflow.com/a/48761812/7910454 tetapi beberapa bulan kemudian
leonheess
4

Satu lagi untuk mereka yang hanya peduli dengan unsur kebenaran

ary.find(Boolean);
Vinnie
sumber
4

Temukan elemen pertama dalam array menggunakan filter:

Dalam naskah:

function first<T>(arr: T[], filter: (v: T) => boolean): T {
    let result: T;
    return arr.some(v => { result = v; return filter(v); }) ? result : undefined;
}

Dalam javascript biasa:

function first(arr, filter) {
    var result;
    return arr.some(function (v) { result = v; return filter(v); }) ? result : undefined;
}

Dan juga, indexOf:

Dalam naskah:

function indexOf<T>(arr: T[], filter: (v: T) => boolean): number {
    let result: number;
    return arr.some((v, i) => { result = i; return filter(v); }) ? result : undefined;
}

Dalam javascript biasa:

function indexOf(arr, filter) {
    var result;
    return arr.some(function (v, i) { result = i; return filter(v); }) ? result : undefined;
}
Corey Alix
sumber
3

Ketika ada beberapa kecocokan, .First () JQuery digunakan untuk mengambil elemen DOM pertama yang cocok dengan pemilih css yang diberikan ke jquery.

Anda tidak perlu jQuery untuk memanipulasi array javascript.

letronje
sumber
3

Mengapa tidak memperhitungkan kali array Anda mungkin kosong?

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
first = (array) => array.length ? array[0] : 'no items';
first(ary)
// output: first

var ary = [];
first(ary)
// output: no items
NathanQ
sumber
3

Gunakan saja ary.slice(0,1).pop();

Di

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

console.log("1º "+ary.slice(0,1).pop());
console.log("2º "+ary.slice(0,2).pop());
console.log("3º "+ary.slice(0,3).pop());
console.log("4º "+ary.slice(0,4).pop());
console.log("5º "+ary.slice(0,5).pop());
console.log("Last "+ary.slice(-1).pop());

array.slice (MULAI, AKHIR) .pop ();

Guilherme HS
sumber
Kenapa ini dan tidak ary[0]?
nathanfranke
2

Anda juga bisa menggunakan .get (0):

alert($(ary).first().get(0));

Untuk mendapatkan elemen pertama dari array.

Michael Pawlowsky
sumber
1

Gunakan ini untuk memisahkan karakter dalam javascript.

var str = "boy, girl, dog, cat";
var arr = str.split(",");
var fst = arr.splice(0,1).join("");
var rest = arr.join(",");
Mohit Singh
sumber
1

Contoh sebelumnya berfungsi dengan baik ketika indeks array dimulai dari nol. jawaban thomax tidak bergantung pada indeks mulai dari nol, tetapi bergantung pada Array.prototype.findyang saya tidak memiliki akses. Solusi berikut menggunakan jQuery $ .each bekerja dengan baik dalam kasus saya.

let haystack = {100: 'first', 150: 'second'},
    found = null;

$.each(haystack, function( index, value ) {
    found = value;  // Save the first array element for later.
    return false;  // Immediately stop the $.each loop after the first array element.
});

console.log(found); // Prints 'first'.
Matius
sumber
1

Anda dapat melakukannya dengan lodash _.head begitu mudah.

var arr = ['first', 'second', 'third', 'fourth', 'fifth'];
console.log(_.head(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Penny Liu
sumber
2
Secara harfiah arr[0]seperti yang Anda lihat di sini, itulah sebabnya saya sangat menyarankan menggunakan perpustakaan raksasa seperti lodash untuk tugas sekecil itu.
leonheess
1

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
alert(Object.values(ary)[0]);

Merak Marey
sumber
Ini adalah vanilla JS, no jQuery, no libs, no-nothing ..: P..it akan berfungsi jika indeks array tidak dimulai dari nol, ini akan bekerja jika dunia belum berakhir ....
Merak Marey
0

@NicoLwk Anda harus menghapus elemen dengan splice, yang akan menggeser array Anda kembali. Begitu:

var a=['a','b','c'];
a.splice(0,1);
for(var i in a){console.log(i+' '+a[i]);}
asinino
sumber
2
Jawaban ini adalah komentar untuk jawaban aboves (NicoLwks), dan harus dihapus
Lino
0

Deklarasikan prototipe untuk mendapatkan elemen array pertama sebagai:

Array.prototype.first = function () {
   return this[0];
};

Kemudian gunakan sebagai:

var array = [0, 1, 2, 3];
var first = array.first();
var _first = [0, 1, 2, 3].first();

Atau cukup (:

first = array[0];
ozhanli
sumber
0

Jika Anda mengubah fungsi tampilan ke array misalnya

array.map(i => i+1).filter(i => i > 3)

Dan ingin elemen pertama setelah fungsi-fungsi ini Anda hanya dapat menambahkan .shift()itu tidak mengubah yang asli array, itu cara yang lebih baikarray.map(i => i+1).filter(=> i > 3)[0]

Jika Anda ingin elemen pertama array tanpa memodifikasi yang asli Anda dapat menggunakan array[0]atau array.map(n=>n).shift()(tanpa peta Anda akan memodifikasi yang asli. Dalam hal ini btw saya akan menyarankan ..[0]versi.

Michael J. Zoidl
sumber
0
var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

console.log(Object.keys(ary)[0]);

Buat array Obyek apa pun ( req), maka cukup lakukan Object.keys(req)[0]untuk memilih kunci pertama dalam array Obyek.

Anuga
sumber
2
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
DimaSan
0

Jawaban @thomax cukup bagus, tetapi akan gagal jika elemen pertama dalam array bernilai false atau false-y (0, string kosong, dll.). Lebih baik mengembalikan benar untuk apa pun selain tidak terdefinisi:

const arr = [];
arr[1] = '';
arr[2] = 'foo';

const first = arr.find((v) => { return (typeof v !== 'undefined'); });
console.log(first); // ''
derikb
sumber
-1

ES6 mudah:

let a = []
a[7] = 'A'
a[10] = 'B'

let firstValue = a.find(v => v)
let firstIndex = a.findIndex(v => v)
Jan Jarčík
sumber
1
Tidak… itu akan mengembalikan nilai yang ditentukan pertama. Jika yang pertama adalah null, undefined, false, 0 atau string kosong, yang akan dilewati. Coba:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken
Poin baiknya, solusi saya hanya berfungsi untuk array dengan nilai yang ditentukan.
Jan Jarčík
1
Lalu mengapa harus menyaring menggunakan nilai? a.find(value => true)tidak akan mengabaikan nilai apa pun. Tetap saja, saya tidak merekomendasikan menggunakan find untuk mendapatkan item pertama.
Flavien Volken
1
@ MiXT4PE mengembalikan true (seperti dalam jawaban Anda) tidak apa-apa karena akan berhenti pada elemen pertama, di sini ia mengembalikan elemen itu sendiri ... yang akan berlanjut jika yang dianggap salah
Flavien Volken
1
@ MiXT4PE menggunakan "find" lebih lambat, lebih rumit dan kurang elegan. Saya juga ragu ada editor pintar yang bisa memperbaiki operasi ini. Menggunakan destructure jauh lebih efisien, dipahami oleh bahasa (sehingga Anda dapat refactor), jenisnya dipahami oleh kompiler (dalam hal TS), dan sangat mungkin solusi tercepat.
Flavien Volken