etc./StackOverFlow

배열의 마지막 항목 가져오기

청렴결백한 만능 재주꾼 2022. 2. 19. 05:48
반응형

질문자 :balexander


지금까지 내 JavaScript 코드는 다음과 같습니다.

 var linkElement = document.getElementById("BackButton"); var loc_array = document.location.href.split('/'); var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); linkElement.appendChild(newT);

현재 URL에서 배열의 마지막 항목에서 두 번째 항목이 필요합니다. 그러나 배열의 마지막 항목이 "index.html" 인지 확인하고 싶습니다. 그렇다면 대신 마지막 항목에서 세 번째 항목을 가져옵니다.



2021년 7월 13일 업데이트

새로운 at() 메서드를 사용하면 음수 인덱스를 사용하여 "끝에서"를 의미할 수 있습니다.

locArray 과 같이 locArray의 마지막 항목에 액세스할 수 있습니다.

 if (locArray.at(-1) === 'index.html') { // do something } else { // something else }

업데이트 at() 메서드는 Chrome 92+, FireFox 90+, Node 16 및 Deno 1.12+에서 지원됩니다.

이전 답변

 if (loc_array[loc_array.length - 1] === 'index.html') { // do something } else { // something else }

서버가 "index.html" 및 "inDEX.htML"에 대해 동일한 파일을 제공하는 경우 .toLowerCase .toLowerCase() 사용할 수도 있습니다.

그러나 가능하면 이 서버 측을 수행하는 것을 고려할 수 있습니다. JS가 없는 사람들에게 더 깨끗하고 작동합니다.


Aaron Harun

단점이 있는지 확실하지 않지만 이것은 매우 간결해 보입니다.

 arr.slice(-1)[0]

또는

 arr.slice(-1).pop()

배열이 비어 있으면 둘 다 undefined


kritzikratzi

Array.pop 사용:

 var lastItem = anArray.pop();

중요 :이 마지막 요소를 반환하고 배열에서 제거


mohawke

@chaiguy가 게시한 것의 짧은 버전:

 Array.prototype.last = function() { return this[this.length - 1]; }

-1 인덱스를 읽으면 undefined 가 반환됩니다.

편집하다:

요즘 기본 설정은 모듈을 사용하고 프로토타입을 만지거나 전역 네임스페이스를 사용하는 것을 피하는 것 같습니다.

 export function last(array) { return array[array.length - 1]; }

Aram Kocharyan

두 가지 옵션은 다음과 같습니다.

 var last = arr[arr.length - 1]

또는

 var last = arr.slice(-1)[0]

전자가 더 빠르지만 후자가 더 멋지게 보입니다.

http://jsperf.com/slice-vs-length-1-arr


Josh Click

원본 ARRAY에 영향을 주지 않고 가져오는 방법은 다음과 같습니다.

 a = [1,2,5,6,1,874,98,"abc"]; a.length; //returns 8 elements

pop()을 사용하면 배열이 수정됩니다.

 a.pop(); // will return "abc" AND REMOVES IT from the array a.length; // returns 7

그러나 이것을 사용할 수 있으므로 원래 배열 에는 영향을 미치지 않습니다.

 a.slice(-1).pop(); // will return "abc" won't do modify the array // because slice creates a new array object a.length; // returns 8; no modification and you've got you last element

ucefkh

성능

오늘 2020.05.16 MacOs High Sierra v10.13.6의 Chrome v81.0, Safari v13.1 및 Firefox v76.0에서 선택한 솔루션의 테스트를 수행합니다.

결론

  • arr[arr.length-1] (D)는 가장 빠른 브라우저 간 솔루션으로 권장됩니다.
  • 변경 가능한 솔루션 arr.pop() (A) 및 변경 불가능한 _.last(arr) (L)는 빠릅니다.
  • 솔루션 I, J는 긴 문자열에 대해 느립니다.
  • 솔루션 H, K(jQuery)는 모든 브라우저에서 가장 느립니다.

여기에 이미지 설명 입력

세부

솔루션에 대해 두 가지 경우를 테스트합니다.

  • 변경 가능: A , B , C ,

  • 불변: D , E , F , G , H , I , J (my),

  • 외부 라이브러리에서 불변: K , L , M ,

두 가지 경우

 function A(arr) { return arr.pop(); } function B(arr) { return arr.splice(-1,1); } function C(arr) { return arr.reverse()[0] } function D(arr) { return arr[arr.length - 1]; } function E(arr) { return arr.slice(-1)[0] ; } function F(arr) { let [last] = arr.slice(-1); return last; } function G(arr) { return arr.slice(-1).pop(); } function H(arr) { return [...arr].pop(); } function I(arr) { return arr.reduceRight(a => a); } function J(arr) { return arr.find((e,i,a)=> a.length==i+1); } function K(arr) { return $(arr).get(-1); } function L(arr) { return _.last(arr); } function M(arr) { return _.nth(arr, -1); } // ---------- // TEST // ---------- let loc_array=["domain","a","b","c","d","e","f","g","h","file"]; log = (f)=> console.log(`${f.name}: ${f([...loc_array])}`); [A,B,C,D,E,F,G,H,I,J,K,L,M].forEach(f=> log(f));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js" integrity="sha256-VeNaFBVDhoX3H+gJ37DpT/nTuZTdjYro9yBruHjVmoQ=" crossorigin="anonymous"></script>

짧은 문자열에 대한 Chrome 결과 예

여기에 이미지 설명 입력


Kamil Kiełczewski

"가장 깨끗한" ES6 방식(IMO)은 다음과 같습니다.

 const foo = [1,2,3,4]; const bar = [...foo].pop();

이것은 만약 우리가 스프레드 연산자를 사용하지 않았다면 .pop() 처럼 foo 변경하는 것을 방지합니다.
즉, foo.slice(-1)[0] 솔루션도 좋아합니다.


ddd

const [lastItem] = array.slice(-1);

-1이 있는 Array.prototype.slice 를 사용하여 원래 Array의 마지막 항목만 포함하는 새 Array를 만들 수 있습니다. 그런 다음 Destructuring Assignment 를 사용하여 새 Array의 첫 번째 항목을 사용하는 변수를 만들 수 있습니다.

 const lotteryNumbers = [12, 16, 4, 33, 41, 22]; const [lastNumber] = lotteryNumbers.slice(-1); console.log(lotteryNumbers.slice(-1)); // => [22] console.log(lastNumber); // => 22


Jamie Mason

인덱스보다 array.pop() 사용하고 싶습니다.

 while(loc_array.pop()!= "index.html"){ } var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));

이렇게 하면 항상 index.html 이전의 요소를 얻을 수 있습니다(배열에 index.html이 하나의 항목으로 분리되어 있는 경우). 참고: 하지만 배열의 마지막 요소는 잃게 됩니다.


Pablo Mescher

const [y] = x.slice(-1)

빠른 설명 :

이 구문 [y] = <array/object> 는 비 구조화 할당 이라고 하며 Mozilla 문서에 따르면 구조 분해 할당을 사용하면 배열의 값이나 개체의 속성을 고유한 변수로 압축 해제할 수 있습니다. 여기에서 더 읽어보기


kingbeencent

이 패턴을 사용할 수 있습니다 ...

 let [last] = arr.slice(-1);

읽기는 좋지만 새 어레이를 생성하므로 다른 솔루션보다 효율성이 떨어지지만 애플리케이션의 성능 병목 현상은 거의 발생하지 않습니다.


alex

const lastElement = myArray[myArray.length - 1];

이것은 성능 관점에서 최고의 옵션입니다( arr.slice(-1) 보다 ~1000배 빠름).


Alexander Burakevych

음수 값과 함께 slice 메서드를 사용하여 배열의 마지막 항목을 얻을 수 있습니다.

자세한 내용은 여기 하단에서 읽을 수 있습니다.

 var fileName = loc_array.slice(-1)[0]; if(fileName.toLowerCase() == "index.html") { //your code... }

pop()을 사용하면 배열이 변경되지만 항상 좋은 생각은 아닙니다.


Mohoch

한 번에 마지막 요소를 얻으려면 Array#splice() 사용할 수 있습니다.

 lastElement = document.location.href.split('/').splice(-1,1);

여기에서는 분할된 요소를 배열에 저장한 다음 마지막 요소로 이동할 필요가 없습니다. 마지막 요소를 얻는 것이 유일한 목적이라면 이것을 사용해야 합니다.

참고: 이렇게 하면 마지막 요소가 제거 되어 원래 배열이 변경됩니다. splice(-1,1) 를 마지막 요소를 팝 pop() 함수로 생각하십시오.


user1144616

자바 스크립트에서 배열의 마지막 값을 찾는 여러 가지 방법

  • 원래 어레이에 영향을 주지 않고

 var arr = [1,2,3,4,5]; console.log(arr.slice(-1)[0]) console.log(arr[arr.length-1]) const [last] = [...arr].reverse(); console.log(last) let copyArr = [...arr]; console.log(copyArr.reverse()[0]);

  • 원래 배열 수정

 var arr = [1,2,3,4,5]; console.log(arr.pop()) arr.push(5) console.log(...arr.splice(-1));

  • 자신만의 헬퍼 메소드를 생성하여

 let arr = [1, 2, 3, 4, 5]; Object.defineProperty(arr, 'last', { get: function(){ return this[this.length-1]; } }) console.log(arr.last);


akhtarvahid

pop() 다음에 마지막 요소를 다시 넣는 것에 대해 언급하지 않았다는 사실에 놀랐습니다.

arr.pop() arr[arr.length-1] 만큼 효율적이고 둘 다 arr.push() 와 같은 속도입니다.

따라서 다음을 수행할 수 있습니다.

---EDITED [푸시하기 전에 thePopundefined

 let thePop = arr.pop() thePop && arr.push(thePop)

---수정 끝---

이것은 다음과 같이 줄일 수 있습니다(동일한 속도 [편집: 하지만 안전하지 않습니다!]).

 arr.push(thePop = arr.pop()) //Unsafe if arr empty

arr[arr.length-1] 보다 2배 느리지만 인덱스를 사용하지 않아도 됩니다. 그것은 어떤 날에도 금의 가치가 있습니다.

arr[arr.length-1] 의 ETU(Execution Time Unit)의 배수:

[방법]..............[ETU 5개 요소]...[ETU 100만개 요소]

 arr[arr.length - 1] ------> 1 -----> 1 let myPop = arr.pop() arr.push(myPop) ------> 2 -----> 2 arr.slice(-1).pop() ------> 36 -----> 924 arr.slice(-1)[0] ------> 36 -----> 924 [...arr].pop() ------> 120 -----> ~21,000,000 :)

마지막 세 가지 옵션인 특히 [...arr].pop() 은 배열의 크기가 커질수록 매우 나빠집니다. 내 컴퓨터의 메모리 제한이 없는 컴퓨터에서 [...arr].pop() 아마도 120:1 비율과 같은 것을 유지합니다. 그래도 자원 호그를 좋아하는 사람은 없습니다.


Paul Parker

Array#at 으로 상대 인덱싱을 사용할 수 있습니다.

 const myArray = [1, 2, 3] console.log(myArray.at(-1)) // => 3

Richie Bendall

여기에 다른 옵션을 넣으면 됩니다.

 loc_array.splice(-1)[0] === 'index.html'

위의 접근 방식이 더 깨끗하고 짧은 온라인 사용자임을 알았습니다. 제발, 이것을 시도하십시오.

참고: 원본 배열을 수정합니다. 수정하지 않으려면 slice()

 loc_array.slice(-1)[0] === 'index.html'

이것을 지적해 주신 @VinayPai 에게 감사드립니다.


sidgujrathi

ES6 객체 구조 분해는 또 다른 방법입니다.

 const {length, [length-1]: last}=[1,2,3,4,5] console.log(last)

Object Destructuring을 사용하여 Array에서 length 속성을 추출합니다. [length-1]로 이미 추출된 키를 사용하여 다른 동적 키를 생성하고 한 줄에 모두 last 에 할당합니다.


gautamits

Array 프로토타입을 오버로드하는 것을 두려워하지 않는 사람들을 위해(그리고 열거 마스킹을 사용 하면 그렇게 해서는 안 됩니다):

 Object.defineProperty( Array.prototype, "getLast", { enumerable: false, configurable: false, writable: false, value: function() { return this[ this.length - 1 ]; } } );

devios1

나는 일반적으로 underscorejs를 사용합니다.

 if (_.last(loc_array) === 'index.html'){ etc... }

loc_array.slice(-1)[0] 보다 더 의미론적입니다.


niels

당신이 그것을 찾고 여기에 온 경우 여기에 더 많은 자바 스크립트 아트가 있습니다

reduceRight() 를 사용했지만 더 짧은 다른 답변의 정신으로:

 [3, 2, 1, 5].reduceRight(a => a);

초기 값을 제공하지 않는 경우 맨 마지막 요소가 초기 요소로 선택된다는 사실에 의존합니다( 여기 에서 문서 확인). 콜백은 초기 값을 계속 반환하므로 마지막 요소는 결국 반환되는 요소가 됩니다.

이것은 Javascript 예술 로 간주되어야 하고 내가 권장하는 방식이 아니라는 점에 주의하십시오. 대부분 O(n) 시간에 실행되지만 가독성이 떨어지기 때문입니다.

그리고 이제 진지한 대답을 위해

내가 보는 가장 좋은 방법은 ( array[array.length - 1] 보다 간결하기를 원한다고 생각하면 ) 다음과 같습니다.

 const last = a => a[a.length - 1];

그런 다음 기능을 사용하십시오.

 last([3, 2, 1, 5])

[3, 2, 1, 5] 와 같은 익명 배열을 처리하는 경우에 실제로 유용합니다. 그렇지 않으면 두 번 인스턴스화해야 하므로 비효율적이고 보기 흉합니다.

 [3, 2, 1, 5][[3, 2, 1, 5].length - 1]

어.

예를 들어 익명 배열이 있고 변수를 정의해야 하지만 대신 last()

 last("1.2.3".split("."));

Lucio Paiva

jQuery 는 이것을 깔끔하게 해결합니다.

 > $([1,2,3]).get(-1) 3 > $([]).get(-1) undefined

Cees Timmerman

원본 배열에서 마지막 항목을 제거하는 것을 방지하려면 다음을 사용할 수 있습니다.

 Array.from(myArray).pop()

모든 브라우저에서 대부분 지원됨(ES6)


Alexandr Malinin

ECMAScript 제안 단계 1 에는 마지막 요소인 proposal-array-last를 반환하는 배열 속성을 추가하라는 제안이 있습니다.

통사론:

 arr.lastItem // get last item arr.lastItem = 'value' // set last item arr.lastIndex // get last index

폴리필 을 사용할 수 있습니다.

제안 저자: Keith Cirkel ( chai autor)


Илья Зеленько

그냥 사용하지 않는 무엇이든간에 reverse() !

몇 가지 답변은 reverse reverse 이 원래 배열을 수정하고 (일부 다른 언어 또는 프레임워크에서와 같이) 사본을 반환하지 않는다는 사실은 언급하지 않습니다.

 var animals = ['dog', 'cat']; animals.reverse()[0] "cat" animals.reverse()[0] "dog" animals.reverse()[1] "dog" animals.reverse()[1] "cat"

이것은 디버그하기에 최악의 유형의 코드가 될 수 있습니다!


Simon_Weaver

개인적으로 나는 kuporific / kritzikratzi의 답변을 찬성합니다. array[array.length-1] 메서드는 중첩 배열로 작업하는 경우 매우 추악해집니다.

 var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1] var array = [[1,2,3], [4,5,6], [7,8,9]]​ array.slice(-1)[0]​ //instead of​ array[array.length-1]​ //Much easier to read with nested arrays​ array.slice(-1)[0].slice(-1)[0]​ //instead of​ array[array.length-1][array[array.length-1].length-1]

Michael Falck Wedelgård

나는 이것이 잘 작동해야한다고 생각합니다.

 var arr = [1, 2, 3]; var last_element = arr.reverse()[0];

배열을 뒤집고 첫 번째 요소를 얻으십시오.

편집: 아래에 언급된 대로 원래 배열이 반전됩니다. 코드를 다음과 같이 변경할 수 있습니다.

 var arr = [1, 2, 3]; var last_element = arr.slice().reverse()[0];

이렇게 하면 원본 배열의 복사본이 생성됩니다.


Zellius

Array 프로토타입에 last() 함수를 추가할 수 있습니다.

 Array.prototype.last = function () { return this[this.length - 1]; };

편집하다:

Symbol 을 사용하여 다른 코드와의 비호환성을 피할 수 있습니다.

 const last = Symbol('last'); Array.prototype[last] = function() { return this[this.length - 1]; }; console.log([0, 1][last]());


trinalbadger587

출처 : http:www.stackoverflow.com/questions/3216013/get-the-last-item-in-an-array

반응형