web-dev-qa-db-ja.com

配列の最後の項目を取得する

これが私の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から配列の最後から2番目の項目を取ります。しかし、私は配列の最後の項目が "index.html"であることを確認したい場合は、最後の3番目の項目を代わりに取得します。

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

サーバが "index.html"と "inDEX.htML"に同じファイルを提供している場合は、.toLowerCase()を使用することもできます。

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

885
Aaron Harun

欠点があるかどうかわからないが、これは非常に簡潔に思える 

arr.slice(-1)[0] 

または

arr.slice(-1).pop()

配列が空の場合、両方ともundefinedを返します。 

713
kritzikratzi

Array.pop :を使用してください。

var lastItem = anArray.pop();

重要 :これは最後の要素andremoveitを返します

183
mohawke

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

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

-1インデックスを読み取ると、すでにundefinedが返されます。

編集:

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

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

2つの選択肢があります:

var last = arr[arr.length - 1]

または

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

前者は速いですが、後者は見栄えが良いです

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

98
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 
57
ucefkh

「最もきれいな」ES6の方法(IMO)は次のようになります。

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

これは、私たちがspread演算子を使わなかった場合、.pop()が持っていたようにfooを変更することを避けます。
そうは言っても、私はfoo.slice(-1)[0]解決策も好きです。

40
ddd

私はむしろインデックスよりarray.pop()を使いたいです。

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

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

38
Pablo Mescher

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

あなたはそれについてもっと読むことができます ここ 下部にあります。

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

Pop()を使用すると配列が変わりますが、これは必ずしも良い考えではありません。

28
Mohoch

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

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

かなり読みやすいですが、新しい配列を作成するため、他のソリューションよりも効率が低下しますが、アプリケーションのパフォーマンスボトルネックになることはほとんどありません。

23
alex

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

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

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

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

19
user1144616

削除せずに要素を取得するだけの場合は、これを使用するのがより簡単です。

arr.slice(-1)

ちなみに...私はパフォーマンスをチェックしませんでした、しかし私は書くのがよりシンプルできれいだと思います

18
terribleWeb

Arrayプロトタイプをオーバーロードすることを恐れていない人のために(および 列挙型マスキングを使って あなたはそうすべきではありません)

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

jQuery はこれをきれいに解決する:

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

私は一般的に underscorejs を使います 

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

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

15
niels

この質問は昔からありますので、最後の要素を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]のExecution Time Unit(ETU)の倍数で、

[方法] ............. [ETUs 5 elems] ... [ETU 100万elems]

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つのオプションESPECIALLY [...arr].pop()は、配列のサイズが大きくなるにつれてさらに悪化します。私のマシンのメモリ制限のないマシンでは、[...arr].pop()はおそらくそれが120:1の比率のような何かを維持しています。それでも、リソースを独占するのが好きな人はいません。

12
Paul Parker

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

last()関数をArrayプロトタイプに追加できます。

Array.prototype.last = function () {
    return this[this.length - 1];
};
9
trinalbadger587
const lastElement = myArray[myArray.length - 1];

これはパフォーマンスの観点からは最良の選択肢です(arr.slice(-1)より約1000倍高速)。

Arrayのすべてのインスタンスからアクセスできるように、新しい property getterArray _に追加できます。

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

最後に、last-プロパティがまだ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では機能しません

8
Matmarbon

編集:  

最近私はもう1つ解決策を考え出しました。これが私のニーズに最も適していると思います。

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

上記の定義が有効であれば、次のようになります。

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

"w" は "wrapper"を表します。 このラッパーに 'last()'以外のメソッドを簡単に追加する方法を見ることができます。

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

7
Panu Logic

ECMAScript提案ステージ1 最後の要素を返す配列プロパティを追加する提案があります: proposal-array-last

構文:

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

arr.lastIndex // get last index

polyfill を使用できます。

提案者: Keith Cirkelchai autor)

私は、最も簡単で超効率の悪い方法は次のように考えています。

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

私は、ヘルパー関数を作成して毎回それを再利用することをお勧めします、あなたはそれが必要です。最後の項目だけでなく、最後から2番目などを取得できるように、関数をより一般的にすることができます。

function last(arr, i) {
    var i = i || 0;
    return arr[arr.length - (1 + i)];
}

使い方は簡単

var arr = [1,2,3,4,5];
last(arr);    //5
last(arr, 1); //4
last(arr, 9); //undefined

さて、元の問題を解決しましょう

最後から2番目のアイテムフォーム配列を取得します。 loc_arrayの最後の項目が "index.html"の場合は、最後から3番目の項目を代わりに取得します。

次の行は仕事をします

last(loc_array, last(loc_array) === 'index.html' ? 2 : 1);

だから、あなたは書き直す必要があるでしょう

var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); 

この方法では

var newT = document.createTextNode(unescape(capWords(last(loc_array, last(loc_array) === 'index.html' ? 2 : 1)))); 

読みやすくするために追加の変数を使用する

var nodeName = last(loc_array, last(loc_array) === 'index.html' ? 2 : 1);
var newT = document.createTextNode(unescape(capWords(nodeName)));
5

配列の最後の項目を取得する簡単な方法:

var last_item = loc_array.reverse()[0];

もちろん、最初に配列に少なくとも1つの項目があることを確認する必要があります。

5
Cong Nguyen

Lodashの使用 _.last(array) arrayの最後の要素を取得します。

data = [1,2,3]
last = _.last(data)
console.log(last)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

3
Deano

ES6/ES2015拡散演算子(...)を使用すると、次のようにすることができます。

const data = [1, 2, 3, 4]
const [last] = [...data].reverse()
console.log(last)

スプレッド演算子とその逆を使って元の配列を変更しなかったことに注意してください。これは配列の最後の要素を取得する純粋な方法です。

2
Vlad Bezden

URLから配列を取り出すことなくこの問題を解決できます

これは私の代わりです

var hasIndex = (document.location.href.search('index.html') === -1) ? doSomething() : doSomethingElse();

ご挨拶

2
snaphuman

あなたがそれを探してここに来た場合、これはもっとJavascriptアートです

reduceRight()を使ったもう一つの答えの精神の中では、もっと短いです:

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

それは、あなたが初期値を提供しない場合、一番最後の要素が最初のものとして選択されるという事実に依存しています(docs here をチェックしてください)。コールバックは初期値を返し続けるだけなので、最後の要素は最後に返されるものになります。

これは Javascript art と考えるべきであり、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("."));
2
Lucio Paiva

以下のようなものはどうでしょうか。

if ('index.html' === array[array.length - 1]) {  
   //do this 
} else { 
   //do that 
}

Underscore を使用する場合は、_.last()を使用できます。

if ('index.html' === _.last(array)) {  
   //do this 
} else { 
   //do that 
}
2
Alireza

これは清潔で効率的です。 

let list = [ 'a', 'b', 'c' ]

(xs => xs[xs.length - 1])(list)

Babelを使ってパイプオペレーターをインストールすると、次のようになります。 

list |> (xs => xs[xs.length - 1])
1
sdgfsdh

reverse()を使わないでください。

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

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

animals.reverse()[0]
"cat"

animals.reverse()[0]
"dog"

animals.reverse()[1]
"dog"

animals.reverse()[1]
"cat"

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

1
Simon_Weaver

このメソッドはあなたのプロトタイプを台無しにすることはありません。また、null/undefined配列と共に、0長さの配列も保護します。返されたデフォルト値が配列内の項目と一致する可能性がある場合は、デフォルト値をオーバーライドすることもできます。

const items = [1,2,3]
const noItems = []

/**
 * Returns the last item in an array.
 * If the array is null, undefined, or empty, the default value is returned.
 */
function arrayLast (arrayOrNull, defVal = undefined) {
  if (!arrayOrNull || arrayOrNull.length === 0) {
    return defVal
  }
  return arrayOrNull[arrayOrNull.length - 1]
}

console.log(arrayLast(items))
console.log(arrayLast(noItems))
console.log(arrayLast(null))

console.log(arrayLast(items, 'someDefault'))
console.log(arrayLast(noItems, 'someDefault'))
console.log(arrayLast(null, 'someDefault'))

1
Steven Spungin

これは、lodash _.last または _.nth で実行できます。

var data = [1, 2, 3, 4]
var last = _.nth(data, -1)
console.log(last)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

1
Yi-Ting Liu

別のES6専用オプションは、以下のようにArray.find(item, index)=> {...})を使用することです。

const arr = [1, 2, 3];
const last = arr.find((item, index) => index === arr.length - 1);

実用的な価値はほとんどなく、インデックスがフィルタリングロジックにも利用できることを示すために投稿されています。

1
Simple.Js

lastArray.prototypeに追加するnpmモジュールもあります。

npm install array-prototype-last --save

使用法

require('array-prototype-last');

[1, 2, 3].last; //=> 3 

[].last; //=> undefined 
1
qiAlex

Originの配列から最後の要素を削除しないようにするには

Array.from(myArray).pop()

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

0

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
0
Jamie Mason

これは機能しますか?

if (loc_array.pop() == "index.html"){
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-3])));
}
else{
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2])));
}
0
balexander

矢印関数 は、配列の名前を繰り返さないことで、最も高速な方法をより簡潔にします。

var lastItem = (a => a[a.length - 1])(loc_array);
0
Joshua Fan

reduceRight :を使う

[3,2,1,5].reduceRight((a,v) => a ? a : v);
0
niedomnie

これは、 Aaron Harun の答えを単純に実装した、きれいなプロトタイプの拡張です。

Array.prototype.i = function(val){
    if (val < 0) return this[this.length - Math.abs(val)]
    return this[val]
}

プロトタイプを定義した後、これは今働くでしょう:

arr = [1, 2, 3, 4, 5]
arr.i(0)  // 1
arr.i(-1) // 5
arr.i(-2) // 4
0
Richie Bendall