配列の最後のアイテムを取得する


1142

これまでの私の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);

現在、配列の最後から2番目の項目がURLから取得されます。ただし、配列の最後の項目があるかどうかを確認したい場合は、最後から"index.html"3番目の項目を代わりに取得します。

回答:


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

サーバーが「index.html」と「inDEX.htML」に同じファイルを提供する場合は、次も使用できます.toLowerCase()

ただし、可能であれば、このサーバー側での実行を検討することをお勧めします。JSを使用していない人にとっては、よりクリーンで機能します。


1051

欠点があるかどうかはわかりませんが、これは非常に簡潔に見えます。

arr.slice(-1)[0] 

または

arr.slice(-1).pop()

undefined配列が空の場合、どちらも戻ります。


31
非構造を使用することはあまりにもいいです:const [lastItem] = arr.slice(-1)
diachedelic

@diachedelicこれは最も滑らかな方法です!驚くばかり!
トゥルファ

1
.pop()元の配列を変更する最後の要素を削除します。それは単にその値を取得することと同じではありません。
Badrush

3
@Badrush slice()は、単一の要素のコピーで新しい配列を作成し、popはそのコピーのみを変更します。元の配列は無傷のままです
kritzikratzi

ただし、このコードが頻繁に呼び出されない限り、新しい配列を作成しないでください。そうしないと、ガベージコレクションに余分な負担がかかり、ブラウザがより多くのメモリを使用するようになります。
mvmn


165

@chaiguyが投稿したものの短いバージョン:

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

-1のインデックスを読み取ると、undefined既に戻ります。

編集:

最近の好みはモジュールを使用しているようで、プロトタイプに触れたり、グローバル名前空間を使用したりすることを避けています。

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

8
これが実際にどのように使用されるかが明らかでない場合は、例を示しますvar lastItem = [3,2,1,5].last();。の値はlastItemです5
user128216 2015

7
この答えは正解ですが、かなりクリーンですが(!!!)Javascriptを使用する経験則はですDo NOT modify objects you Do NOT own。この方法は標準ではないため、チームで作業している他の開発者が混乱する可能性があります。2。ライブラリの更新や、より低いまたはより高いECMAScriptバージョンを使用すると、簡単にLOSTになる可能性があります。
Farzad YZ 2016

1
疑問に思う方のために、これはArray.forEach()を壊します。プロトタイプを変更することは、最悪の事態ではないことに同意しますが、これは悪いことです。
Seph Reed、2017

1
Imoを変更してもそれほど大きな問題はありませんが、Array.prototypeを使用する必要がありますObject.assign(Array.prototype, 'last', { value: function () { … } });。それ以外の場合、プロパティは列挙可能になります。
黄雨伞


70

元の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 

6
slice(-1).pop()を実行する必要があります。そうでない場合は、配列全体をコピーします(最後の要素をコピーするだけで十分です)。
kritzikratzi

その必要はありませんpop()。ただarr.slice(-1)[0]
クリストフマロワ2017

56

「最もクリーンな」ES6方法(IMO)は次のようになります。

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

これにより、spread演算子を使用しなかった場合のように、の変更が回避さfoo.pop()ます。
そうは言っても、私はfoo.slice(-1)[0]解決策も好きです。


1
配列の構造解除を使用して、より多くの ES6 にすることもできます;)stackoverflow.com/a/46485581/31671
alex

36
このソリューションはアレイ全体のコピーを実行することに注意してください。
ブレンダンアナブル

4
それはと同じくらい判読不能ですが.slice(-1)[0]、それは遅いです。同様に使用する可能性がある.slice
fregante '19

12
「クリーン」な構文のためだけに配列全体をコピーすることは、私にはばかげているようです。それはそれほど美しくも見えません
ジェマールジョーンズ

43

array.pop()インデックスよりも使用したい。

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

このようにして、常にindex.htmlの前の要素を取得します(配列にindex.htmlが1つのアイテムとして分離されている場合)。注:ただし、配列の最後の要素は失われます。


38

削除せずに要素を取得するだけの場合は、もっと簡単にこれを使用します:

arr.slice(-1)[0]

注:配列が空の場合(例:)、[]これはを返しundefinedます。

ちなみに...パフォーマンスはチェックしませんでしたが、書く方がシンプルでクリーンだと思います


a)これは最後の値を返さず、最後の要素(arr.slice(-1)[0] === arr[arr.length - 1])を含む配列を返します。b)arr新しい配列にコピーするため、遅いです(パフォーマンス測定については、stackoverflow.com / a / 51763533/2733244を参照してください)。
wortwart

33

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

-1を指定したArray.prototype.sliceを使用して、元の配列の最後の項目のみを含む新しい配列を作成できます。次に、Destructuring Assignmentを使用して、その新しい配列の最初の項目を使用して変数を作成できます。

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

console.log(lotteryNumbers.slice(-1));
// => [22]
console.log(lastNumber);
// => 22


30

配列の最後の項目を取得するには、負の値でスライスメソッドを使用します。

詳細については、こちらの下部をご覧ください

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

pop()を使用すると配列が変更されますが、これは常に良い考えとは限りません。


1
ただし、Sliceは配列を返すのでarr.slice(-1)[0]この答えのようにを使用します
Cees Timmerman 2013年

4
パフォーマンスに問題がある場合は、この方法がarray[array.length - 1] jsperf.com/get-last-item-from-array/13
Bruno Peres

29

このパターンを使用できます...

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

それはかなりうまく読みながら、それは他のソリューションよりも効率だが、それがあることはほとんどないだろうので、それは新しい配列を作成し、心に留めておく、アプリケーションのパフォーマンスのボトルネック。


25

この質問はずっと前からあったので、の後に最後の要素を元に戻すことについて誰も言及しなかったことに驚きpop()ます

arr.pop()はとまったく同じくらい効率的arr[arr.length-1]で、どちらもと同じ速度arr.push()です。

したがって、次の方法で回避できます。

--- EDITED [ プッシュする前にthePopないことを確認undefined] ---

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

---編集を終了---

これを減らすことができます(同じ速度[編集:しかし安全ではありません!]):

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

これはの2倍の速度arr[arr.length-1]ですが、インデックスを使用する必要はありません。それはいつでも金の価値があります。

私が試したソリューションのうち、実行時間単位(ETU)の倍数でarr[arr.length-1]

[方法] .............. [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 :)

最後の3つのオプション([...arr].pop()特に)は、配列のサイズが大きくなるにつれて非常に悪くなります。私のマシンのメモリ制限のないマシンでは、[...arr].pop()おそらく120:1の比率のようなものを維持します。それでも、誰もリソースの独り占めが好きではありません。


3
最初の配列が空になる可能性がある場合、このアプローチは正しく行われず、[]に変わり[undefined]ます。あなたは、明示的に後方に押しを保護するために必要なundefinedチェック、のようなものmyPop !== undefined && arr.push(myPop)
dhilt

23

一度に最後の要素を取得したい場合は、次のように使用できますArray#splice()

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

ここでは、分割された要素を配列に格納し、最後の要素に到達する必要はありません。最後の要素を取得することが唯一の目的である場合は、これを使用する必要があります。

注:これにより、最後の要素が削除され、元の配列が変更されます。最後の要素をポップsplice(-1,1)するpop()関数と考えてください。


5
これは、最後の要素自体ではなく、配列の最後の要素を返しませんか?

2
@tozazaburoも同じじゃないですか?
アラムKocharyan

5
これにより配列が変更されます。splice(-1)の代わりにslice(-1)を使用して、元の配列をそのままにすることができます。ノー@AramKocharyanその、比較しないで["hi"]"hi"
kritzikratzi 2013

20

Arrayプロトタイプをオーバーロードすることを恐れない人のために(そして列挙マスキングを使用してはいけません):

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


18

私は通常underscorejsを使用しますがそれであなたはちょうど行うことができます

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

私にとってそれはより意味的です loc_array.slice(-1)[0]


18

あなたがそれを探してここに来たなら、ここにもっとJavascriptアートがあります

を使用した別の答えの精神で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]、上記のように無名配列を処理している場合に実際に役立ちます。そうでない場合は、2回インスタンス化する必要があり、非効率的で見苦しいものになります。

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

ああ。

たとえば、無名配列があり、変数を定義する必要がある状況ですが、last()代わりに使用できます。

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

16

ここに別のオプションを置くだけです。

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

私は、上記のアプローチの方がよりクリーンで短いオンラインであることがわかりました。ぜひ、気軽に試してみてください。

注:元の配列を変更します。変更したくない場合は、使用できます。 slice()

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

これを指摘してくれた@VinayPaiに感謝します。


この投稿に関するstackoverflow.com/users/510036/qix-monica-was-mistreatのコメントによると、stackoverflow.com / questions / 9050345 /…と、 非常に遅いjsperf.com/last-array-element2でのテスト
スバッシュ

13

JavaScriptで配列の最後の値を見つける複数の方法

  • 元のアレイに影響を与えることなく

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)
console.log(arr.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);


「元の配列に影響を及ぼさない」console.log(arr.reverse()[0]) 述べた最初の例で、提案されたとおりに実行した場合:-おめでとうございます。元の配列を変更しただけです。
ロコC.ブルジャン


10

個人的に私は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]


10

元の配列から最後のアイテムを削除しないようにするには、次のようにします

Array.from(myArray).pop()

ほとんどのブラウザでサポートされています(ES6)


1
100.000要素以上の大きな配列で頑張ってください。
Soldeplata Saketos


9

使用するだけではなく、reverse() !!!

いくつかの回答reversereverseは、元の配列を変更し、(他の言語やフレームワークのように)コピーを返さないという事実について言及していますが言及していません。

var animals = ['dog', 'cat'];

animals.reverse()[0]
"cat"

animals.reverse()[0]
"dog"

animals.reverse()[1]
"dog"

animals.reverse()[1]
"cat"

これは、デバッグするのに最悪のタイプのコードになる可能性があります。


4
配列の反転コピーが必要な場合は、spreadオペレーターを使用できます。例[...animals].reverse()
Josh R

リバースを使用する前にアレイをコピーするだけです[1,3,4,5,"last"].slice().reverse()[0]
Madeo

9

ES6オブジェクトの破壊は別の方法です。

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

オブジェクトの分解を使用して、配列から長さプロパティを抽出します。[length-1]によって既に抽出されたキーを使用して別の動的キーを作成し、それをすべて1行でlastに割り当てます。


少しトリッキーですが賢いです。
Adrien Castagliola

おかげで、それが何をするのか正確に説明できますか?
Tarun Nagpal

8

のすべてのインスタンスからアクセスできるように、新しいプロパティゲッターをのプロトタイプにArray追加できますArray

ゲッターを使用すると、プロパティの値のように、関数の戻り値にアクセスできます。もちろん、関数の戻り値は配列(this[this.length - 1])の最後の値です。

最後に、それをlast-propertyがまだundefined(それに依存する可能性のある別のスクリプトによって定義されていない)かどうかをチェックする条件でラップします。

if(typeof Array.prototype.last === 'undefined') {
    Object.defineProperty(Array.prototype, 'last', {
        get : function() {
            return this[this.length - 1];
        }
    });
}

// Now you can access it like
[1, 2, 3].last;            // => 3
// or
var test = [50, 1000];
alert(test.last);          // Says '1000'

IE≤8では機能しません。


Array.prototype.last常にundefinedですか?ifがChrome 36で動作しない
bryc '23

7

編集:

最近、私はもう1つの解決策を考え出しました。この解決策は、自分のニーズに最適だと思います。

function w(anArray) {
  return {
    last() {
      return anArray [anArray.length - 1];
    };
  };
}

上記の定義が有効であれば、次のように言うことができます。

let last = w ([1,2,3]).last();
console.log(last) ; // -> 3

「w」という名前は「ラッパー」を意味します。このラッパーに「last()」以外のメソッドを簡単に追加する方法を確認できます。

「自分のニーズに最適」と言います。これにより、他のそのような「ヘルパーメソッド」をJavaScriptの組み込み型に簡単に追加できるためです。頭に浮かぶのは、たとえばLispのcar()とcdr()です。


なぜラッパーを使うのですか?w関数を呼び出す必要がある場合は、関数に最後の項目を返させるだけです。
fregante

w([1,2,3]).length未定義です。w([1,2,3])[1]未定義です。私にはラッパーのようには見えません。そして、構文エラーがあります。余分な「;」があります。クラスラッパー(SutStringクラス)を記述し、リフレクションを使用してそのラッパーを生成する方法については、stackoverflow.com / a / 49725374/458321を参照してください。しかし、私見では、ラッパーはやり過ぎです。あなたがほとんど持っているように、カプセル化を使用する方が良いです。return { arr: anArray, last() { return anArray[anArray.length - 1]; } };。また、wは一般的すぎます。呼び出しはArrayWか何かです。
TamusJRoyce

6

私は最も簡単で超非効率的な方法だと思います:

var array = ['fenerbahce','arsenal','milan'];
var reversed_array = array.reverse(); //inverts array [milan,arsenal,fenerbahce]
console.log(reversed_array[0]) // result is "milan".

43
このソリューションはO(n)より多くのメモリを必要とし、O(n)の時間がかかります。それは本当に理想的な解決策ではありません。
hlin117 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.