Bir dizinin ilk elemanını nasıl edinebilirim?


236

İlk öğeyi böyle bir diziden nasıl alırsınız:

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

Bunu denedim:

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

Ama geri dönecekti [object Object]. Bu yüzden, öğe olması gereken diziden ilk öğeyi almam gerekiyor 'first'.


2
Cevapları aktif olarak
leonheess

Yanıtlar:


338

bunun gibi

alert(ary[0])

36
var a = []; a[7] = 'foo'; alert(a[0]);
Petah

72
Bu, dizideki ilk öğenin her zaman 0 dizinine sahip olduğunu varsayar. Varsayım hakkında ne söylediklerini biliyorsunuz ...
Andy

16
@Andy OP'nin sorusu oldukça açık ve spesifik olduğu için hiçbir varsayım yoktu.
John Hartsock

5
@Petah bu kodda yanlış bir şey yok. Bu tanımlanmamıştır, çünkü aslında dizideki ilk öğe olan bir [0] 'ın değeri budur. Eğer foo'yu göstermesini istiyorsanız, tanımlanmamış tüm değerleri atlamanız gerekir, ancak dizideki ilk öğe olmaz.
Michiel van der Blonk

5
@MichielvanderBlonk Sadece bazı kullanıcıların beklemeyebileceği bir uç durumu işaret ediyordum.
Petah


92

Farklı durumlar için aşağıdaki yollardan bazıları.

Çoğu normal durumda, ilk öğeye erişmenin en basit yolu

yourArray[0]

ancak bu, [0] öğesinin gerçekten olup olmadığını kontrol etmenizi gerektirir.

Orijinal diziyi umursamadığınız ve dizinin var olup olmadığını kontrol etmek istemediğiniz gerçek dünya vakaları vardır, sadece ilk öğeyi veya tanımsız satır içi almak istersiniz.

Bu durumda, ilk öğeyi almak için shift () yöntemini kullanabilirsiniz, ancak bu yöntemin orijinal diziyi değiştirdiğine dikkat edin (ilk öğeyi kaldırır ve döndürür). Bu nedenle bir dizinin uzunluğu bir azalır. Bu yöntem, yalnızca ilk öğeyi almanız gereken satır içi durumlarda kullanılabilir, ancak orijinal diziyi önemsemezsiniz.

yourArray.shift()

Bilmeniz gereken önemli şey, yukarıdaki ikisinin yalnızca diziniz bir [0] diziniyle başlıyorsa bir seçenek olmasıdır.

İlk öğenin silindiği durumlar vardır, örneğin, dizinizi "delikler" ile terk ederek dizinizi [0] silin. Şimdi [0] 'daki eleman basitçe tanımsız, ancak ilk "mevcut" elemanı almak istiyorsunuz. Bunun birçok gerçek dünya örneğini gördüm.

Yani, dizi ve ilk anahtar hakkında hiçbir bilgimiz olmadığını varsayarsak (veya delikler olduğunu biliyoruz), yine de ilk elemanı alabiliriz.

Sen kullanabilirsiniz find () birinci elemanını alır.

Find () yönteminin avantajı, koşulu karşılayan ilk değere ulaşıldığında döngüden çıktığı için verimliliğidir (daha fazlası aşağıdadır). (Durumu boş veya diğer boş değerleri de hariç tutacak şekilde özelleştirebilirsiniz)

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

Ben de filtre () burada ilk kopyasını dizi "düzeltmek" ve sonra orijinal dizi bozulmadan (değiştirilmemiş) tutarken ilk öğe almak için bir seçenek olarak eklemek istiyorum .

Burada filter () 'i eklemenin başka bir nedeni, find ()' dan önce var olması ve birçok programcının onu zaten kullanmasıdır (find () 'ın ES6 olmasına karşı ES5).

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

Filter () işlevinin gerçekten etkili bir yol olmadığına (filter () tüm öğeler arasında çalışır) ve başka bir dizi oluşturduğuna dikkat edin. Performans etkisi marjinal, örneğin forEach kullanımına daha yakın olacağı için küçük dizilerde kullanmak iyidir.

(Bazılarının ilk öğeyi elde etmek için ... in döngüsünde kullanılmasını önerdiğini görüyorum, ancak ... için bu yönteme karşı tavsiye ederim. o değil çünkü' tarayıcılar çoğunlukla sipariş saygı iddia iddia rağmen t garanti. bu arada, forEach sorunu çözemez birçok önermek çünkü kırmak olamaz ve tüm öğeleri üzerinden çalışacaktır. için basit bir kullanarak kapalı daha iyi olurdu döngü ve anahtar / değer kontrol ederek

Hem find () hem de filter () öğelerin sırasını garanti eder, bu nedenle yukarıdaki gibi kullanmak güvenlidir.


1
Neden daha sonra diziyi kaydırmıyorsunuz, örneğin: var element = yourArray.shift (); yourArray.unshift (eleman);
Greg

9
Çünkü çok verimsiz ve kötü bir şey. İlk unsuru çok verimli bir şekilde elde edebilirsiniz. Vardiya ve unshift hem görevi kontrol etmek için tüm dizileri kontrol eder ve tüm diziyi geçer, çünkü başlangıçta yeni bir öğe kaldırdığınızda veya eklediğinizde, diğer tüm dizinler kaydırılmalıdır. Sanki insanlarla dolu bir otobüsünüz var ve arka koltuktan biri inmek istediğinde, otobüsü ön kapıdan boşaltıyorsunuz ve sonra tekrar inmelerini istersiniz.
Selay

1
@ Tercümanın belirli içlerine bağlı olan gecikme.
Michiel van der Blonk

@Michiel van der Blonk Lütfen belirttiğiniz gibi hangi tercümanın yaptığını bana bildirir misiniz? İlgimi çekiyor. Benim bildiğim tüm uygulamalar döngü ve kopya kullanır. JavaScript dizileri böyle çalışır. İlk öğeyi kolayca kaldıramazsınız, çünkü kalan dizi şimdi düzeltmeniz gereken 1'den (0 konumundaki öğe kaldırıldı) başlar. Hangi dahili uygulamaya sahip olursanız olun sihir yapamazsınız.
Selay

Eğer kullandığınız yourArray.map(n=>n).shift()bu en iyi yol olup olmadığını bilmiyorum ... o orijinal değiştirmeden ilk öğeyi döndürür ancak .map bir dizi zincirle eğer (). Filtreyi (). Bazı (). Kayması () tamam .. aksi takdirde kullanırdımyourArray[0]
Michael J. Zoidl

53

ES6 yıkımını kullanma

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

Hangisi ile aynı

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

Yıkmanın yalnızca diziniz bir [0] diziniyle başlıyorsa bir seçenek olduğunu eklemek uygun olabilir.
leonheess

53

İlk öğe silinmişse dizin 0 öğesi bulunmayabilir:

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

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

JQuery olmadan ilk elemanı almanın daha iyi bir yolu:

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

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


1
a.entries () [0] yapmalı :)
Edson Medina

1
Çünkü bir dizi ile numaralandırma için kullanmamalısınız, çünkü dizi üyelerini değil nesneleri numaralandırır. Bunun yerine geleneksel bir for döngüsü ile indeksleme kullanın.
Oskar Duveborn

Benzer ES6 yaklaşımı (sayısal endekslere de dayanmamaktadır) burada: stackoverflow.com/a/56115413/7910454
leonheess

46

Okunabilirliği korumak istiyorsanız, aşağıdakilere her zaman bir ilk işlev ekleyebilirsiniz Array.protoype:

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

A sonra ilk öğeyi kolayca alabilirsiniz:

[1, 2, 3].first();
> 1

14
iyi bir nedenden dolayı herhangi bir şekilde temel sınıfların prototipleriyle uğraşmak çok kötü bir uygulama olarak kabul edilir.
Dmitry Matveev

11
bu saçma, yazmaktan .first()daha iyi nasıl [0]?
jonschlinkert

10
@jonschlinkert Bazı dillerde başlayan dizinler vardır 1. firstbu durumda açıktır.
Bartek Banachewicz

6
[] .first () ne döndürür?
Rhyous

1
Testimde tanımsız olarak dönüyor. Ben tanımsız dönen dönen gibi karar vermeye çalışıyorum.
Rhyous

33

Sadece şunu kullanabilirsiniz find():

let first = array.find(Boolean);

Veya ilk öğeyi sahte olsa bile istiyorsanız :

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

Fazladan yola çıkmak:

Okunabilirliği önemsiyorsanız ancak sayısal olaylara güvenmek istemiyorsanız , yerleşik Array nesnesi prototipini doğrudan değiştirmenin güçlüklerini azaltan bir tanım first()işlevi ekleyebilirsiniz ( burada açıklanmıştır ).Array.protoypeObject​.define​Property()

Performans oldukça iyidir ( find()ilk öğeden sonra durur) ancak mükemmel veya evrensel olarak erişilebilir değildir (yalnızca ES6). Daha fazla arka plan için @Selays cevabını okuyun .

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

Sonra ilk elemanı almak için şunları yapabilirsiniz:

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

> 'a'

Snippet'i çalışırken görmek için:

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

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


3
Bu en iyi ve en güncel cevaptır. Aynı şeyi buraya göndermek üzereydim, ama
seninkini

Ve dilin gelecekteki bir versiyonunda find () ekleyeceklerse ne olur? :-) yukarıdaki pasaj kırmaz mı?
Bogdan

@Bogdan Ekleyecekleri zamanfind() ne demek istiyorsun ? find()uzun zamandır dilin bir parçası. Yukarıdaki pasajın çalışmasının nedeni budur.
leonheess

Ohh. Üzgünüm biraz ben ilk atıfta çok uyudum değil yorgun.
Bogdan

@Bogdan Yine de gayet iyi çalışıyor ama potansiyel geleceğin üzerine first()yazılıyor
leonheess

18

Dizinizin sıfır dizininden doldurulması garanti edilmezse, şunları kullanabilirsiniz 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'

3
Bu gerçekten daha yüksek oylanmalıdır. Vanilya js kullanan ve seyrek dizileri açıklayan en özlü çözüm.
Dominic P


1
!!elementYanlış değerleri atlayacağından kullanmaya karşı tavsiye ederim . find()Bu şekilde kullanmanızı tavsiye ederim :sparse.find((_, index, array) => index in array);
Victor Welling

Burada yanlış değerleri göz ardı etmeden benzer yaklaşım: stackoverflow.com/a/56115413/7910454
leonheess 14:19

13
array.find(e => !!e);  // return the first element 

"bul" ifadesi, filtreyle eşleşen ilk öğeyi döndürür & !!eherhangi bir öğeyle eşleşir.

Not İlk öğesinin "Falsy" değilken Bu yalnızca çalışır: null, false, NaN, "", 0,undefined


1
Durumunuz herhangi bir gerçeğe uygun öğeyle eşleşir, yani <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = örnek.find (e => !! e); // ilk falsili olan 5. elementi atar: {} </code>
PDA

Yakalamak için @ PDA teşekkürler. BTW, boş dize de yanlış kabul edilir
Abdennour TOUMI

3
bu harika ve TypeScript'te de harika çalışıyor. Basitleştirmeye ne dersiniz array.find(() => true);? Bu da yapmanıza izin verir [false].find(() => true).
Simon Warta

@SimonWarta elbette .find(value => true)beklendiği gibi çalışıyor… ama dürüst olmak gerekirse, daha temiz bir kod istiyorsanız ve daktiloda yazmayı sürdürmek için yıkımı kullanın .
Flavien Volken

Sahte cevabı görmezden gelmenin tuzakları olmadan benzer bir yol için bu cevaba bakınız
leonheess



7

Diğer dillerden JavaScript'e gelen, bir dizinin ilk elemanını almak head()veya first()almak için bir şey arayan insanların olduğunu biliyorum , ama bunu nasıl yapabilirsiniz?

Aşağıdaki diziye sahip olduğunuzu düşünün:

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

JavaScript'te şunları yapabilirsiniz:

const first = arr[0];

veya daha temiz, daha yeni bir yol:

const [first] = arr;

Ama aynı zamanda şöyle bir işlev de yazabilirsiniz ...

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

Alt çizgi kullanıyorsanız, aradığınız şeyi yapan işlevlerin listesi vardır:

_.first 

_.head

_.take

6

Yöntem şu diziler ile çalışır ve bu nesnelerle çalışır çok (dikkat, nesneler garantili bir düzen yok!).

Özgün dizi değiştirilmediğinden bu yöntemi en çok tercih ediyorum.

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


4

Sadece doğru unsurlarla ilgilenenler için bir diğeri

ary.find(Boolean);

4

Filtre kullanarak dizideki ilk öğeyi bulun:

Daktilo yazısında:

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

Düz javascriptte:

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

Ve benzer şekilde, indexOf:

Daktilo yazısında:

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

Düz javascriptte:

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

3

Birden fazla eşleşme olduğunda, JQuery'nin .first () yöntemi, jquery'ye verilen css seçiciyle eşleşen ilk DOM öğesini getirmek için kullanılır.

Javascript dizilerini değiştirmek için jQuery'ye ihtiyacınız yoktur.


3

Dizinizin boş olduğu zamanları neden hesaba katmıyorsunuz?

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

3

Sadece kullan ary.slice(0,1).pop();

İçinde

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

(Başlangıç, bitiş) (.pop) array.slice;


Neden bu ve değil ary[0]?
nathanfranke

2

Ayrıca .get (0) kullanabilirsiniz:

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

Dizinin ilk elemanını almak.


1

Javascript içindeki karakteri bölmek için bunu kullanın.

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

1

Dizi dizini sıfırdan başladığında önceki örnekler iyi çalışır. thomax'ın cevabı sıfırdan başlayarak endekse bağlı değildi, ancak erişimim olmadığına güveniyordu Array.prototype.find. Aşağıdaki çözüm jQuery $ .each kullanarak benim durumumda iyi çalıştı.

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'.

1

Bunu kolayca lodash ile yapabilirsiniz _.head.

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>


2
Tam anlamıyla buradaarr[0] gördüğünüz gibi yapar , bu yüzden böyle küçük bir görev için lodash gibi devasa bir kütüphane kullanmayı şiddetle tavsiye ederim .
leonheess

1

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


Bu vanilya JS, hiçbir jQuery, hiçbir libs, hayır-hiçbir şey ..: P.. dizi dizini sıfırdan başlamazsa çalışır, dünya bitmemişse çalışır ....
Merak Marey

0

@NicoLwk Dizinizi geri kaydıracak ek yeri olan öğeleri kaldırmalısınız. Yani:

var a=['a','b','c'];
a.splice(0,1);
for(var i in a){console.log(i+' '+a[i]);}

2
Bu cevap aboves (NicoLwks) cevabına yapılan bir yorumdur ve silinmelidir
Lino

0

İlk dizi öğesini almak için bir prototip bildirin :

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

Sonra şu şekilde kullanın:

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

Ya da sadece (:

first = array[0];

0

Diziye bir görünüm işlevleri bağlıyorsanız, ör.

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

Ve bu işlevlerden sonra ilk öğeyi istediğinizde .shift()orijinali değiştirmeyen bir öğe ekleyebilirsiniz array, daha güzel bir yolarray.map(i => i+1).filter(=> i > 3)[0]

Eğer orijinali değiştirmeden bir dizinin ilk elemanını kullanmak isterseniz array[0]veya array.map(n=>n).shift()(harita olmadan orijinali değiştirebilirsiniz. Bu durumda btw ..[0]sürümü öneririm .


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

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

Herhangi bir Object dizisini ( req) yapın, daha sonra Object.keys(req)[0]Object dizisindeki ilk anahtarı seçmek için yapın.


2
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
DimaSan

0

@thomax'ın cevabı oldukça iyi, ancak dizideki ilk eleman false veya false-y (0, boş dize vb.) ise başarısız olur. Undefined dışında herhangi bir şey için doğru dönmek daha iyidir:

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

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

-1

ES6 kolay:

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

let firstValue = a.find(v => v)
let firstIndex = a.findIndex(v => v)

1
Hayır… ilk tanımlı değeri döndürür. İlki null, undefined, false, 0 veya boş bir dize ise, bu atlanır. Deneyin:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken

İyi bir nokta, benim çözümüm sadece tanımlı değerlere sahip dizi için çalışır.
Jan Jarčík

1
Öyleyse neden değeri kullanarak filtre uygulamak gerekir? a.find(value => true)hiçbir değeri atmaz. Yine de, ilk öğeyi almak için find komutunu kullanmanızı önermiyorum.
Flavien Volken

1
@ MiXT4PE true döndürme (cevabınızda olduğu gibi) tamam çünkü ilk öğede duracak, burada öğenin kendisini döndürüyor… bu yanlış kabul edilirse devam edecek
Flavien Volken

1
@ MiXT4PE "find" kullanarak daha yavaş, daha karmaşık ve daha az zariftir. Ayrıca, bu işlemi yeniden düzenleyebilecek herhangi bir akıllı editör olduğundan şüpheliyim. Yıkımı kullanmak çok daha verimlidir, dil tarafından anlaşılır (böylece yeniden düzenleyebilirsiniz), tür derleyici tarafından (TS durumunda) ve büyük olasılıkla en hızlı çözüm tarafından anlaşılır.
Flavien Volken
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.