Як отримати перший елемент масиву?


236

Як отримати перший елемент з такого масиву:

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

Я спробував це:

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

Але повернеться [object Object]. Тому мені потрібно отримати перший елемент з масиву, який повинен бути елементом 'first'.


2
Я настійно рекомендую сортувати відповіді за активними
leonheess

Відповіді:


338

подобається це

alert(ary[0])

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

72
Це передбачає, що перший елемент масиву завжди має індекс 0. Ви знаєте, що вони говорять про припущення ...
Енді

16
@Andy Припущень не було, оскільки питання ОП було досить чітким та конкретним.
Джон Харцок

5
@Petah з цим кодом нічого поганого. Він просто показує невизначене, оскільки це значення [0], яке фактично є першим елементом у масиві. Якщо ви хочете, щоб він відображав foo, вам слід пропустити всі невизначені значення, але це не буде першим елементом у масиві.
Міхель ван дер Блок

5
@MichielvanderBlonk Я просто вказав на крайній випадок, якого деякі користувачі можуть не очікувати.
Petah

202

Чому ви jQuery - якщо ви використовуєте ванільний масив JavaScript? Використовуйте стандартний JavaScript!

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

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

Також, потребує більше jQuery

Джерело , ввічливість bobince


1
Зверніться до цієї відповіді, чому це рішення не завжди працює.
Густаво Страубе

92

Нижче наведено декілька способів для різних обставин

У більшості звичайних випадків найпростіший спосіб отримати доступ до першого елемента - за допомогою

yourArray[0]

але для цього потрібно перевірити, чи [0] насправді існує.

Є випадки реального світу, коли вам не байдужий оригінальний масив, і не хочете перевіряти, чи існує індекс, ви хочете просто отримати перший елемент або невизначений рядок.

У цьому випадку ви можете використовувати метод shift (), щоб отримати перший елемент, але будьте обережні, що цей метод модифікує вихідний масив (видаляє перший елемент і повертає його). Тому довжина масиву зменшується на одиницю. Цей метод може бути використаний у вбудованих випадках, коли вам просто потрібно отримати перший елемент, але ви не дбаєте про вихідний масив.

yourArray.shift()

Важливо знати, що два вище - це лише варіант, якщо ваш масив починається з індексу [0].

Бувають випадки, коли перший елемент був видалений, наприклад, delete yourArray [0], залишаючи масив "дірками". Тепер елемент у [0] просто не визначений, але ви хочете отримати перший "існуючий" елемент. Я бачив багато випадків цього в реальному світі.

Отже, припускаючи, що ми не маємо знань про масив і перший ключ (або ми знаємо, що є дірки), ми все одно можемо отримати перший елемент.

Ви можете використовувати find (), щоб отримати перший елемент.

Перевагою find () є її ефективність, оскільки він виходить з циклу, коли досягається перше значення, що задовольняє умові (детальніше про це нижче). (Ви можете налаштувати умову і для виключення нульових чи інших порожніх значень)

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

Я також хотів би включити filter () сюди як варіант спочатку "виправити" масив у копії, а потім отримати перший елемент, зберігаючи початковий масив недоторканим (немодифікованим).

Ще одна причина включити filter () сюди - це те, що він існував до find (), і багато програмісти вже використовували його (це ES5 проти, щоб find () був ES6).

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

Попередження, що filter () насправді не є ефективним способом (filter () проходить через усі елементи) та створює інший масив. Це добре використовувати на малих масивах, оскільки вплив на продуктивність буде маргінальним, наприклад, ближчим до використання forEach.

(Я бачу, що деякі люди пропонують використовувати для ... in loop, щоб отримати перший елемент, але я б рекомендував проти цього методу для ... in не слід використовувати для ітерації над масивом, де порядок індексів важливий, оскільки він не ' не гарантую замовлення, хоча браузери в основному поважають порядок. До речі, forEach не вирішує проблему, як багато хто пропонує, тому що ви не можете його порушити, і він буде проходити через усі елементи. Було б краще використовувати простий для циклу та перевіряючи ключ / значення

І find (), і filter () гарантують порядок елементів, тому їх безпечно використовувати, як зазначено вище.


1
Чому б просто не відхилити масив після цього, наприклад: var element = yourArray.shift (); yourArray.unshift (елемент);
Грег

9
Бо це дуже неефективно і погано. Перший елемент можна отримати набагато ефективнішим чином. І зсув, і зсув виконують деякі перевірки та проходять весь масив, щоб досягти завдання, оскільки, коли ви видаляєте або додаєте новий елемент до початку, всі інші індекси повинні бути зміщені. Це ніби у вас автобус, повний людей, і коли хтось із заднього сидіння хоче вийти, ви спорожняєте автобус через вхідні двері, а потім просите їх знову сісти.
Селай

1
@Selay, що залежить від конкретних інтерпретаторів перекладача.
Міхель ван дер Блок

@Michiel van der Blonk Чи можете ви, будь ласка, повідомте мені, який перекладач робить це, як ви згадали. Мені дуже цікаво. Усі відомі мені реалізації використовують цикл та копію. Це так, як працюють масиви JavaScript. Ви не можете просто видалити перший елемент, тому що решта масиву тепер починається з 1 (елемент у позиції 0 видалено), який потрібно виправити. Ви не можете робити магію, незалежно від того, яка внутрішня реалізація у вас є.
Селай

Якщо ви використовуєте yourArray.map(n=>n).shift() це, він поверне перший елемент без зміни оригіналу ... не знаю, чи це найкращий спосіб, але якщо ви ланцюжок масиву з .map (). Filter (). Some (). Shift () це добре .. інакше я б скориставсяyourArray[0]
Майкл Дж. Зоідл

53

Елемент індексу 0 може не існувати, якщо перший елемент був видалений:

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

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

Кращий спосіб отримати перший елемент без jQuery:

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

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


1
a.entries () [0] повинні це зробити :)
Едсон Медіна

1
Це тому, що ви не повинні використовувати такий вид для перерахування з масивом, оскільки це перерахування об'єктів, а не членів масиву. Використовуйте індексацію традиційним циклом.
Оскар Дувеборн

Подібний підхід ES6 (також не покладатися на числових індексів) тут: stackoverflow.com/a/56115413/7910454
leonheess

51

Використання ES6 деструкції

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

Що таке саме

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

Можливо, доречно додати, що знищення - це лише варіант, якщо ваш масив починається з індексу [0].
leonheess

46

Якщо ви хочете зберегти читальність, ви завжди можете додати першу функцію до Array.protoype:

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

Тоді ви можете легко отримати перший елемент:

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

14
вважається дуже поганою практикою будь-яким чином повозитися з прототипами базових класів з поважної причини.
Дмитро Матвєєв

11
це нерозумно, як набрати текст .first()краще, ніж робити [0]?
jonschlinkert

10
@jonschlinkert У деяких мовах індекси починаються з 1. firstв цьому випадку однозначно.
Bartek Banachewicz

6
що повертає [] .first ()?
Rhyous

1
У моєму тесті він повертається невизначеним. Я намагаюся вирішити, чи подобається мені повертатися невизначеним.
Rhyous

33

Ви можете просто використовувати find():

let first = array.find(Boolean);

Або якщо ви хочете перший елемент, навіть якщо він хибний :

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

Проходження зайвої милі:

Якщо ви дбаєте про читання , але не хочете покладатися на цифрових числах випадків можна додати first()-функції в Array.protoypeвизначивши його Object​.define​Property()пом'якшуючих підводні камені модифікації вбудованого масив прототип об'єкта безпосередньо ( пояснені тут ).

Продуктивність досить хороша ( find()зупиняється після першого елемента), але вона не є досконалою або загальнодоступною (лише для ES6). Щоб отримати докладнішу інформацію, прочитайте відповідь @Selays .

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

Потім для отримання першого елемента ви можете:

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

> 'a'

Знімок, щоб побачити його в дії:

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

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


3
Це найкраща і найсучасніша відповідь. Я збирався розмістити тут те саме, але після того, як я побачив ваші :)
Костанос

А що станеться, якщо в майбутній версії мови вони додадуть find ()? :-) Чи не перервав би її наведений фрагмент?
Богдан

@Bogdan Що ти маєш на увазі, коли вони додадутьfind() ? find()здавна є частиною мови. Це причина, чому вищевказаний фрагмент працює.
leonheess

Ох. Вибачте, трохи стомлений не багато спав, я звертався до першого.
Богдан

@Bogdan Це все одно буде чудово працювати, але замінить потенційне майбутнє first()-метод мови
leonheess

18

Якщо ваш масив не гарантовано заповнений з нуля індексу, ви можете використовувати 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
За це дійсно слід голосувати вище. Це найкоротше рішення, яке я бачу, що використовує ванільний js та рахунки для розріджених масивів.
Домінік П


1
Я б радив не використовувати, !!elementоскільки це буде пропускати хибні значення. Я б рекомендував використовувати find()такий спосіб:sparse.find((_, index, array) => index in array);
Віктор Веллінг

Подібний підхід не відхиляючи falsy значення тут: stackoverflow.com/a/56115413/7910454
leonheess

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

оскільки "знайти" поверне перший елемент, який відповідає фільтру && !!e відповідний будь-якому елементу.

Примітка Це працює тільки тоді , коли перший елемент не є «Falsy»: null, false, NaN, "", 0,undefined


1
Абденнор, щоб уточнити для інших, ваш стан відповідає будь-якому truthy елементу, тобто <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = example.find (e => !! e); // призначає 5-й елемент, перший не фальшивий: {} </code>
КПК

Дякуємо @PDA за підтягування. До речі, порожня рядок вважається також
хибною

3
це чудово і також чудово працює в TypeScript. Що щодо спрощення array.find(() => true);? Це дозволяє зробити [false].find(() => true)це також.
Simon Warta

@SimonWarta, звичайно, .find(value => true)працює просто, як очікувалося ... але якщо чесно, якщо ви хочете отримати чистіший код і продовжувати набирати машинопис, використовуйте руйнування .
Флав'єн Волкен

Дивіться цю відповідь подібним чином без підводних каменів ігнорування
фальшивих



7

Я знаю, що люди, які переходять з інших мов на JavaScript, шукають щось подібне head()абоfirst() отримують перший елемент масиву, але як це можна зробити?

Уявіть, що у вас є масив нижче:

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

У JavaScript ви можете просто робити:

const first = arr[0];

або більш акуратним, новішим способом є:

const [first] = arr;

Але ви також можете просто написати таку функцію, як ...

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

Якщо використовується підкреслення, є список функцій, які роблять те саме, що ви шукали:

_.first 

_.head

_.take

6

Метод, який працює з масивами , і він також працює з об'єктами (будьте обережні, об'єкти не мають гарантованого порядку!).

Я віддаю перевагу цьому методу найбільше, тому що оригінальний масив не модифікується.

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

Ще один для тих, хто стосується лише фальшивих елементів

ary.find(Boolean);

4

Знайдіть перший елемент у масиві за допомогою фільтра:

У машинописі:

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

У простому javascript:

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

І аналогічно, indexOf:

У машинописі:

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

У простому javascript:

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

3

Коли є декілька збігів, JQuery's .first () використовується для отримання першого елемента DOM, який відповідає селектору css, заданому jquery.

Вам не потрібен jQuery для маніпулювання масивами javascript.


3

Чому б не записати час, коли масив може бути порожнім?

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

Просто використовуйте ary.slice(0,1).pop();

В

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 (START, END) .pop ();


Чому це і ні ary[0]?
nathanfranke


1

Використовуйте це для розділення символів у JavaScript.

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

1

Попередні приклади добре працюють, коли індекс масиву починається з нуля. відповідь thomax не покладалася на індекс, що починався з нуля, але спирався на те, Array.prototype.findщо я не мав доступу. Наступне рішення з використанням jQuery $ .each добре працювало в моєму випадку.

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

Ви можете зробити це лодаш _.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
Це буквально так, arr[0]як ви бачите тут, і саме тому я сильно перешкоджаю використовувати гігантську бібліотеку на зразок лодашу для такого невеликого завдання.
leonheess

1

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


Це ванільна JS, ні jQuery, ні libs, ні-що ..: P..it спрацює, якщо індекс масиву не розпочнеться з нуля, він буде працювати, якщо світ не закінчився ....
Мерак Марей,

0

@NicoLwk Вам слід видалити елементи зі сплайсом, що змістить масив назад. Так:

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

2
Ця відповідь є коментарем до відповіді aboves (NicoLwks), і її слід видалити
Lino

0

Оголосіть прототип, щоб отримати перший елемент масиву як:

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

Потім використовуйте його як:

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

Або просто (:

first = array[0];

0

Якщо ви прив'язуєте функції перегляду до масиву, наприклад

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

І хочете, щоб перший елемент після цих функцій ви можете просто додати, .shift()він не змінює оригінал array, тоді він приємнішеarray.map(i => i+1).filter(=> i > 3)[0]

Якщо ви хочете перший елемент масиву без зміни оригіналу, ви можете використовувати array[0]або array.map(n=>n).shift()(без карти ви модифікуєте оригінал. У цьому випадку btw я б запропонував ..[0]версію.


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

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

Зробіть будь-який об’єктний масив ( req), а потім просто зробіть, Object.keys(req)[0]щоб вибрати перший ключ у масиві Object.


2
Хоча цей фрагмент коду може вирішити питання, у тому числі пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
DimaSan

0

Відповідь @thomax є досить хорошою, але не вдасться, якщо перший елемент масиву false або false-y (0, порожній рядок тощо). Краще просто повернути істину для нічого, крім визначеного:

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

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

-1

ES6 легко:

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

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

1
Ні ... це поверне перше визначене значення. Якщо перший є нульовим, невизначеним, хибним, 0 або порожнім рядком, це буде пропущено. Спробуйте:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken

Добре, моє рішення працює лише для масиву із визначеними значеннями.
Ян Ярчик

1
Тоді навіщо фільтрувати за допомогою значення? a.find(value => true)не відхиляє жодних значень. Проте я не рекомендую використовувати пошук, щоб отримати перший предмет.
Флав'єн Волкен

1
@ MiXT4PE повернення істини (як у вашій відповіді) добре, тому що воно зупиниться на першому елементі, тут він поверне сам елемент… який продовжиться, якщо цей вважатиметься помилковим
Флавіен Волкен

1
@ MiXT4PE використання "знайти" повільніше, складніше та менш елегантно. Я також сумніваюся, що є якийсь розумний редактор, здатний переробляти цю операцію. Використання деструктуризації набагато ефективніше, розуміється мовою (так що ви можете рефакторувати), тип розуміється компілятором (у випадку ТС) і, швидше за все, найшвидшим рішенням.
Флавіен Волкен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.