javascript - Kako dobiti prvi element niza?
Kako dobiti prvi element iz niza poput ovog:
var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
Pokušao sam ovo:
alert($(ary).first());
Ali vratilo bi [object Object]. Dakle, trebam dobiti prvi element iz niza koji bi trebao biti element 'first'.
Odgovor #1
ovako
alert(ary[0])
Odgovor #2
Zašto jQuery-iziraš obični JavaScript niz? Koristi standardni JavaScript!
var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
alert(ary[0]);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
Također,
Izvor, ljubaznošću bobince
Odgovor #3
Neki od načina u nastavku za različite okolnosti.
U većini normalnih slučajeva, najjednostavniji način za pristup prvom elementu je
yourArray[0]
ali ovo zahtijeva da provjerite postoji li stvarno [0].
Druga često korištena metoda je shift(), ali biste trebali izbjegavati korištenje ove metode za pristup prvom elementu.
Pa, ova metoda mijenja izvornu polje (uklanja prvi element i vraća ga), ali ponovno indeksira ono što je preostalo u polju kako bi počelo od 0 (pomica sve prema dolje). Stoga se duljina polja smanjuje za jedan. Postoje dobri slučajevi u kojima vam ovo može zatrebati, na primjer, za uzimanje prvog kupca koji čeka u redu, ali je vrlo neučinkovito koristiti ovo za pristup prvom elementu.
Osim toga, ovo zahtijeva savršen niz s netaknutim pokazivačem indeksa [0], upravo kao kod korištenja [0];
yourArray.shift()
Važno je znati da su gore navedene dvije opcije primjenjive samo ako vaš niz počinje s indeksom [0]. :
Postoje slučajevi u kojima je prvi element izbrisan, na primjer s delete yourArray[0], ostavljajući vaš niz s "rupama". Sada je element na [0] jednostavno undefined, ali želite dobiti prvi "postojeći" element. Vidio sam mnogo stvarnih slučajeva ovoga.
Dakle, pretpostavljajući da nemamo znanje o nizu i prvom ključu (ili ako znamo da postoje praznine), i dalje možemo dobiti prvi element.
Možete koristiti find() da biste dobili prvi element.
Prednost find() je njegova učinkovitost jer izlazi iz petlje kada se pronađe prva vrijednost koja zadovoljava uvjet (više o tome u nastavku). (Uvjet možete prilagoditi tako da isključuje null ili druge prazne vrijednosti također)
var firstItem = yourArray.find(x=>x!==undefined);
Također bih ovdje želio uključiti filter() kao opciju da prvo "popravim" niz u kopiji, a zatim dobijem prvi element, pritom zadržavajući originalni niz nepromijenjenim.
Još jedan razlog za uključivanje filter() ovdje je što je postojala prije find() i mnogi programeri su je već koristili (to je ES5 u odnosu na find() koji je ES6).
var firstItem = yourArray.filter(x => typeof x!==undefined).shift();
Upozorenje da filter() zapravo nije učinkovit način (filter() prolazi kroz sve elemente) i stvara još jedan niz. Dobro je koristiti ga na malim nizovima jer bi utjecaj na performanse bio neznatan, bliže korištenju forEach(), na primjer.
Još jedan koji sam vidio u nekim projektima je splice() za dobivanje prvog elementa u nizu, a zatim njegovo dohvaćanje po indeksu:
var firstItem = yourArray.splice(0, 1)[0];
Nisam siguran zašto biste to učinili. Ova metoda neće riješiti problem s rupama u nizu (rijedak niz). Ona je skupa jer će ponovno indeksirati niz, i vraća niz kojemu morate ponovno pristupiti da biste dobili vrijednost. Na primjer, ako obrišete prva dva elementa, tada će splice() vratiti undefined umjesto prve definirane vrijednosti iz niza.
I find() i filter() jamče redoslijed elemenata, pa ih je sigurno koristiti kao gore.
**(Vidim da neki ljudi predlažu korištenje petlji za dobivanje prvog elementa, ali bih preporučio da se ova metoda izbjegne. Očigledno je da možete koristiti bilo koju petlju za dobivanje vrijednosti iz niza, ali zašto biste to radili? Čitljivost, optimizacija, nepotreban blok koda itd. Kada koristite ugrađene funkcije, preglednik može bolje optimizirati vaš kod. I možda čak neće raditi s nekim petljama koje ne jamče redoslijed u iteraciji.
Usput, forEach() ne rješava problem kako mnogi sugeriraju jer ga ne možete prekinuti i on će proći kroz sve elemente. Bilo bi bolje koristiti jednostavnu for petlju i provjeravati ključ/vrijednost, ali zašto?
Odgovor #4
Možete jednostavno koristiti find():
const first = array.find(Boolean)
Ili ako želite prvi element čak i ako je neistinit:
const first = array.find(() => true)
Ili ako želite prvi element čak ako je neistinit, ali ne ako je neodređen (više informacija):
const first = array.find(e => typeof e !== 'undefined')
Ići korak dalje:
Ako vam je stalo do čitljivosti, ali ne želite oslanjati se na numeričke incidencije, možete dodati funkciju first() na Array.prototype tako da je definirate pomoću Object.defineProperty(), što ublažava nedostatke izravnog mijenjanja prototipa ugrađenog Array objekta (objašnjeno ovdje).
Performanse su prilično dobre (find() prestaje nakon prvog elementa), ali nisu savršene niti univerzalno dostupne (samo ES6). Za više informacija pročitajte @Selays odgovor.
Object.defineProperty(Array.prototype, 'first', {
value() {
return this.find(e => true) // or this.find(Boolean)
}
})
Za dohvat prvog elementa sada možete učiniti ovo:
const array = ['a', 'b', 'c']
array.first()
> 'a'
Isječak da ga vidite u akciji:
Object.defineProperty(Array.prototype, 'first', {
value() {
return this.find(Boolean)
}
})
console.log( ['a', 'b', 'c'].first() )Odgovor #5
Korištenje ES6 destrukturiranja
let [first] = [1,2,3];
Što je isto kao
let first = [1,2,3][0];
Odgovor #6
Element indeksa 0 možda ne postoji ako je prvi element izbrisan:
let a = ['a', 'b', 'c'];
delete a[0];
for (let i in a) {
console.log(i + ' ' + a[i]);
}Bolji način da se dobije prvi element bez jQuerya:
function first(p) {
for (let i in p) return p[i];
}
console.log( first(['a', 'b', 'c']) );Odgovor #7
Ako želite sačuvati čitljivost, uvijek možete dodati prvu funkciju na Array.prototype:
Array.prototype.first = function () {
return this[0];
};
A tada biste mogli jednostavno dohvatiti prvi element:
[1, 2, 3].first();
> 1
Odgovor #8
Ako vaš niz nije zajamčeno popunjen od indeksa nula, možete koristiti 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'
Odgovor #9
array.find(e => !!e); // return the first element
budući da "find" vraća prvi element koji odgovara filtru && !!e odgovara bilo kojem elementu.
Napomena Ovo radi samo kada prvi element nije "Falsy": null, false, NaN, "", 0, undefined
Odgovor #10
U ES2015 i novijim verzijama, korištenjem destrukturiranja nizova:
const arr = [42, 555, 666, 777]
const [first] = arr
console.log(first)Odgovor #11
Znam da ljudi koji dolaze iz drugih jezika u JavaScript traže nešto poput head() ili first() kako bi dobili prvi element niza, ali kako to možete učiniti?
Zamislite da imate sljedeći niz:
const arr = [1, 2, 3, 4, 5];
U JavaScriptu možete jednostavno učiniti:
const first = arr[0];
ili uredniji, noviji način je:
const [first] = arr;
Ali također možete jednostavno napisati funkciju poput...
function first(arr) {
if(!Array.isArray(arr)) return;
return arr[0];
}
Ako koristite donju crtu, postoji popis funkcija koje rade istu stvar koju tražite:
_.first
_.head
_.take
Odgovor #12
ES6 Spread operator + .shift() rješenje :
Korištenjem myArray.shift() možete dobiti prvi element niza, ali .shift() će izmijeniti originalni niz, pa da biste to izbjegli, prvo možete napraviti kopiju niza s [...myArray] i zatim primijeniti .shift() na tu kopiju:
var myArray = ['first', 'second', 'third', 'fourth', 'fifth'];
var first = [...myArray].shift();
console.log(first);Odgovor #13
Samo u slučaju da koristite underscore.js (http://underscorejs.org/) možete učiniti sljedeće:
_.first(your_array);
