배열의 첫 번째 요소를 얻는 방법?


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 OP의 질문은 분명하고 구체적이기 때문에 가정이 없었습니다.
John Hartsock

5
@Petah 그 코드에는 아무런 문제가 없습니다. 배열의 첫 번째 항목 인 a [0]의 값이므로 정의되지 않은 상태로 표시됩니다. foo를 표시하려면 정의되지 않은 모든 값을 건너 뛰어야하지만 배열의 첫 번째 항목은 아닙니다.
Michiel van der Blonk

5
@ MichielvanderBlonk 나는 단순히 일부 사용자가 기대할 수없는 가장자리 사례를 지적하고있었습니다.
Petah


92

다른 상황에 따라 아래의 몇 가지 방법이 있습니다.

대부분의 경우 첫 번째 요소에 액세스하는 가장 간단한 방법은

yourArray[0]

그러나 [0]이 실제로 존재하는지 확인해야합니다.

실제 배열에 신경 쓰지 않고 색인이 존재하는지 확인하고 싶지 않은 경우 첫 번째 요소 또는 정의되지 않은 인라인을 얻으려는 실제 사례가 있습니다.

이 경우 shift () 메서드를 사용 하여 첫 번째 요소를 가져올 수 있지만이 메서드는 원래 배열을 수정하고 첫 번째 항목을 제거하고 반환해야합니다. 따라서 배열의 길이는 1 씩 줄어 듭니다. 이 방법은 첫 번째 요소를 가져와야하는 인라인 경우에 사용할 수 있지만 원래 배열은 신경 쓰지 않습니다.

yourArray.shift()

알아야 할 중요한 사항은 배열이 [0] 인덱스로 시작하는 경우 위의 두 옵션 만 옵션이라는 것입니다.

첫 번째 요소가 삭제 된 경우가 있는데, 예를 들어 yourArray [0]을 삭제하면 배열에 "구멍"이 남습니다. 이제 [0]의 요소는 정의되지 않았지만 첫 번째 "기존"요소를 가져 오려고합니다. 나는 이것에 대한 많은 실제 사례를 보았습니다.

따라서 배열과 첫 번째 키에 대한 지식이 없거나 첫 번째 키를 알고 있다고 가정하면 여전히 첫 번째 요소를 얻을 수 있습니다.

find () 를 사용 하여 첫 번째 요소를 얻을 수 있습니다 .

find ()의 장점은 조건을 만족하는 첫 번째 값에 도달하면 루프를 빠져 나가는 효율성입니다 (자세한 내용은 아래 참조). (널 또는 다른 빈 값도 제외하도록 조건을 사용자 정의 할 수 있습니다)

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

또한 filter ()를 여기에 먼저 복사에서 배열을 "수정"하고 원래 배열을 그대로 유지하면서 첫 번째 요소를 가져 오는 옵션으로 포함하고 싶습니다 .

여기에 filter ()를 포함시키는 또 다른 이유는 find () 이전에 존재했으며 많은 프로그래머가 이미 사용하고 있기 때문입니다 (find ()에 대한 ES5는 ES6 임).

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

filter ()는 실제로 효율적인 방법은 아니며 (filter ()가 모든 요소를 ​​통해 실행 됨) 다른 배열을 만듭니다. 예를 들어 forEach를 사용하는 경우 성능에 미치는 영향이 미미하므로 소규모 어레이에서 사용하는 것이 좋습니다.

(나는 어떤 사람들은 첫 번째 요소를 얻기 위해 루프를 위해 ... 사용하는 것이 좋습니다 볼 수 있지만, 나는이 방법에 대해 추천 을 위해 ... 배열을 통해 반복 사용하지 않아야의 인덱스 순서가 중요한 경우 는 아무튼 때문에 ' 브라우저가 대부분의 순서를 존중한다고 주장 할 수는 있지만 순서를 보장하지는 않지만 forEach는 문제를 해결할 수 없기 때문에 많은 제안 된 문제를 해결하지 못하며 모든 요소를 ​​통과하게됩니다. 루프 및 키 / 값 확인

find ()와 filter ()는 요소의 순서를 보장하므로 위와 같이 사용하는 것이 안전합니다.


1
나중에 배열의 이동을 해제하지 않는 이유는 다음과 같습니다. var element = yourArray.shift (); yourArray.unshift (요소);
그렉

9
그것은 매우 비효율적이고 나쁜 일이기 때문입니다. 첫 번째 요소를 훨씬 효율적으로 얻을 수 있습니다. shift와 unshift는 검사를 수행하고 전체 배열을 순회하여 작업을 수행하기 때문에 처음에 새 요소를 제거하거나 추가 할 때 다른 모든 인덱스를 이동해야하기 때문입니다. 마치 사람들로 가득 찬 버스가 있고 뒷좌석에서 누군가 내리려고 할 때 정문을 통해 버스를 비운 다음 다시 타라고 요청하십시오.
Selay

1
인터프리터의 특정 내부에 의존하는 @Selay.
Michiel van der Blonk

@Michiel van der Blonk 당신이 언급 한대로 어떤 통역사가 그 일을하는지 알려주십시오. 나는 매우 관심이 있습니다. 나에게 알려진 모든 구현은 루프 및 복사를 사용합니다. JavaScript 배열이 작동하는 방식입니다. 나머지 배열은 이제 1부터 시작하므로 (0 위치의 요소 제거) 수정해야하는 첫 번째 요소를 쉽게 제거 할 수 없습니다. 내부 구현에 관계없이 마술을 만들 수 없습니다.
Selay

당신이 yourArray.map(n=>n).shift()그것을 사용 하면 원본을 수정하지 않고 첫 번째 항목을 반환합니다 ... 그것이 가장 좋은 방법인지는 모르지만 .map (). filter (). some (). shift ()로 배열을 체인하면 괜찮습니다. .. 그렇지 않으면 내가 사용하는 것이yourArray[0]
마이클 J. Zoidl

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
배열 멤버가 아닌 객체를 열거하기 때문에 배열과 함께 열거에 이러한 종류를 사용해서는 안되기 때문입니다. 대신 전통적인 for 루프를 사용하여 인덱싱을 사용하십시오.
Oskar Duveborn

여기에 (또한 숫자 인덱스에 의존하지 않음) 유사 ES6 방법 : stackoverflow.com/a/56115413/7910454
leonheess

51

ES6 파괴 사용

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

어느 것과

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

배열이 [0] 인덱스로 시작하는 경우 Destructing이 옵션 일 뿐이라는 점을 추가하는 것이 좋습니다.
leonheess

46

가독성 을 유지하려면 항상 첫 번째 함수를 Array.protoype:

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

그런 다음 첫 번째 요소를 쉽게 검색 할 수 있습니다.

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

14
어떤 이유로 든 기본 클래스의 프로토 타입을 다루는 것은 매우 나쁜 습관으로 간주됩니다.
Dmitry Matveev

11
어리석은 일 .first()보다 타이핑이 더 나은 [0]가요?
jonschlinkert

10
@jonschlinkert 일부 언어에는에서 시작하는 색인이 1있습니다. first이 경우 모호하지 않습니다.
Bartek Banachewicz

6
[] .first ()는 무엇을 반환합니까?
Rhyous 2016 년

1
내 테스트에서는 정의되지 않은 값을 반환합니다. 정의되지 않은 반환을 좋아하는지 결정하려고합니다.
Rhyous 2016 년

33

당신은 그냥 사용할 수 있습니다 find() :

let first = array.find(Boolean);

또는 거짓 인 경우 에도 첫 번째 요소를 원하는 경우 :

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

추가 마일로 이동 :

가독성에 관심이 있지만 숫자 발생에 의존하고 싶지 않다면 내장 Array 객체 프로토 타입을 직접 수정하는 함정을 완화시키는 기능 을 정의 first()하여 추가 할 수 있습니다 ( 여기 설명 ).Array.protoypeObject​.define​Property()

성능은 꽤 좋지만 ( find()첫 번째 요소 다음에 멈춤) 완벽하거나 보편적으로 액세스 할 수있는 것은 아닙니다 (ES6 만 해당). 더 많은 배경을 보려면 @Selays answer를 읽으 십시오 .

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
이것은 가장 좋고 가장 최신의 답변입니다. 나는 여기에 동일하게 게시하려고했지만, 당신의 것을 본 후에 :)
Kostanos

향후 버전의 언어에서 find ()를 추가하면 어떻게됩니까? :-) 위의 코드 조각이 깨지지 않습니까?
Bogdan

@Bogdan 추가 할 때find() 무엇을 의미 합니까? find()오랫동안 언어의 일부였습니다. 위의 스 니펫이 작동하는 이유입니다.
leonheess

오 죄송하지만 조금 피곤해서 처음봤을 때 많이 잤습니다.
Bogdan

그것은 아직 완벽하게 잘 작동하지만, 덮어 쓰기 @Bogdan 잠재적 인 미래는 first()언어의 -method
leonheess

18

배열이 인덱스 0에서 채워지지 않을 경우 다음을 사용할 수 있습니다 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를 사용하고 희소 배열을 설명하는 가장 간결한 솔루션입니다.
Dominic P


1
!!element허위 값을 건너 뛰므로 사용 하지 않는 것이 좋습니다. find()이런 식으로 사용 하는 것이 좋습니다 .sparse.find((_, index, array) => index in array);
Victor Welling

여기 falsy 값을 제거하지 않고 비슷한 접근 방식 stackoverflow.com/a/56115413/7910454
leonheess을

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

"find"는 필터와 일치하는 첫 번째 요소를 리턴하고 &&는 !!e모든 요소와 일치합니다.

참고 첫 번째 요소는 "Falsy"없는 경우에만 작동 : null, false, NaN, "", 0,undefined


1
다른 사람을 위해 당신의 조건이 어떤 진실한 요소와 일치 하는지를 명확히하기 위해, 즉 <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = example.find (e => !! e); // 다섯 번째 요소, 첫 번째 허위가 아닌 요소를 지정합니다 : {} </ code>
PDA

따라와 주셔서 감사합니다 @PDA. BTW, 빈 문자열도 거짓으로 간주됩니다
Abdennour TOUMI

3
이것은 훌륭하고 TypeScript에서도 훌륭하게 작동합니다. 단순화는 array.find(() => true);어떻습니까? 이것은 당신도 할 수 [false].find(() => true)있습니다.
Simon Warta

@SimonWarta는 물론 .find(value => true)예상대로 작동하지만 솔직히 코드를 깔끔하게 작성하고 타이핑을 타이프 스크립트로 유지하려면 파괴를 사용하십시오 .
Flavien Volken

허위 요소를 무시하는 함정없이 비슷한 방법 으로이 답변 을 보십시오
leonheess



7

내가 좋아하는 뭔가를 찾고, 자바 스크립트로 다른 언어에서 오는 그 사람을 알 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;
}

일반 자바 스크립트에서 :

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

일반 자바 스크립트에서 :

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

3

일치하는 항목이 여러 개인 경우 JQuery의 .first ()는 jquery에 제공된 CSS 선택기와 일치하는 첫 번째 DOM 요소를 가져 오는 데 사용됩니다.

자바 스크립트 배열을 조작하기 위해 jQuery가 필요하지 않습니다.


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

이것을 사용하여 문자를 자바 스크립트로 분할하십시오.

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

1

앞의 예제는 배열 인덱스가 0에서 시작할 때 잘 작동합니다. thomax의 답변 은 0에서 시작하는 색인에 의존 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

당신은 그것을 할 수 lodash _.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]당신이 볼 수 있듯이 여기에 내가 이유입니다 강력하게 같은 작은 작업 lodash 같은 거대한 라이브러리를 사용하여 낙담.
leonheess

1

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


이것은 바닐라 JS, jQuery, libs, no-nothing입니다. : : 배열 인덱스가 0에서 시작하지 않으면 작동합니다.
메라크 Marey

0

@NicoLwk 스플 라이스로 요소를 제거하면 배열이 다시 이동합니다. 그래서:

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

2
이 답변은 위의 (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]객체 배열에서 첫 번째 키를 선택하기 만하면 됩니다.


2
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
DimaSan 2012

0

@thomax의 대답은 꽤 좋지만 배열의 첫 번째 요소가 false 또는 false-y (0, 빈 문자열 등)이면 실패합니다. 정의되지 않은 것 이외의 것에 대해서만 true를 반환하는 것이 좋습니다.

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
아니요… 첫 번째로 정의 된 값을 반환합니다. 첫 번째 문자열이 null, undefined, false, 0 또는 빈 문자열이면 해당 문자열을 건너 뜁니다. 시도 :[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken

좋은 해결책은 솔루션이 정의 된 값을 가진 배열에 대해서만 작동한다는 것입니다.
Jan Jarčík

1
그렇다면 왜 값을 사용하여 필터링합니까? a.find(value => true)어떤 값도 무시하지 않습니다. 그래도 find를 사용하여 첫 번째 항목을 얻는 것은 좋지 않습니다.
Flavien Volken

1
@ MiXT4PE 반환 사실 (당신의 대답에로)는 첫 번째 요소에서 중지됩니다 있기 때문에 하나가 false로 간주되는 경우 계속 요소 자체 ... 반환, 여기 괜찮습니다
의 Flavien Volken

1
"find"를 사용하는 @ MiXT4PE는 더 느리고 더 복잡하며 덜 우아합니다. 또한이 작업을 리팩터링 할 수있는 스마트 편집기가 있는지 의심합니다. 구조화를 사용하는 것이 훨씬 효율적이고 언어에 의해 이해되므로 (리팩토링 가능) 컴파일러에 의해 형식이 이해되고 (TS의 경우) 가장 빠른 솔루션 일 가능성이 높습니다.
Flavien Volken
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.