これが私の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番目の項目を代わりに取得します。
if(loc_array[loc_array.length-1] == 'index.html'){
//do something
}else{
//something else.
}
サーバが "index.html"と "inDEX.htML"に同じファイルを提供している場合は、.toLowerCase()
を使用することもできます。
ただし、可能であれば、このサーバーサイドの使用を検討することをお勧めします。JSを使用していない人にとっては、よりクリーンで機能的になります。
欠点があるかどうかわからないが、これは非常に簡潔に思える
arr.slice(-1)[0]
または
arr.slice(-1).pop()
配列が空の場合、両方ともundefined
を返します。
@chaiguyが投稿したものの短いバージョン:
Array.prototype.last = function() {
return this[this.length - 1];
}
-1インデックスを読み取ると、すでにundefined
が返されます。
編集:
最近では、モジュールを使用し、プロトタイプに触れたり、グローバル名前空間を使用したりしないようにしているようです。
export function last(array) {
return array[array.length - 1];
}
2つの選択肢があります:
var last = arr[arr.length - 1]
または
var last = arr.slice(-1)[0]
前者は速いですが、後者は見栄えが良いです
元の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
「最もきれいな」ES6の方法(IMO)は次のようになります。
const foo = [1,2,3,4];
const bar = [...foo].pop();
これは、私たちがspread演算子を使わなかった場合、.pop()
が持っていたようにfoo
を変更することを避けます。
そうは言っても、私はfoo.slice(-1)[0]
解決策も好きです。
私はむしろインデックスよりarray.pop()
を使いたいです。
while(loc_array.pop()!= "index.html"){
}
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));
このようにして、あなたは常にindex.htmlの前の要素を得ることになります(あなたの配列が一つのアイテムとしてindex.htmlを分離している場合) 注: 配列の最後の要素は失われます。
配列の最後の項目を取得するには、 slice メソッドを負の値で使用します。
あなたはそれについてもっと読むことができます ここ 下部にあります。
var fileName = loc_array.slice(-1)[0];
if(fileName.toLowerCase() == "index.html")
{
//your code...
}
Pop()を使用すると配列が変わりますが、これは必ずしも良い考えではありません。
このパターンを使用できます...
let [last] = arr.slice(-1);
かなり読みやすいですが、新しい配列を作成するため、他のソリューションよりも効率が低下しますが、アプリケーションのパフォーマンスボトルネックになることはほとんどありません。
最後の要素を一度に取得したい場合は、 Array#splice()
を使用します。
lastElement = document.location.href.split('/').splice(-1,1);
ここでは、分割された要素を配列に格納してから最後の要素に到達する必要はありません。最後の要素を取得することが唯一の目的である場合は、これを使用する必要があります。
注: これは最後の要素を削除することによって元の配列を変更します 。 splice(-1,1)
を最後の要素をポップするpop()
関数と考えてください。
削除せずに要素を取得するだけの場合は、これを使用するのがより簡単です。
arr.slice(-1)
ちなみに...私はパフォーマンスをチェックしませんでした、しかし私は書くのがよりシンプルできれいだと思います
Arrayプロトタイプをオーバーロードすることを恐れていない人のために(および 列挙型マスキングを使って あなたはそうすべきではありません)
Object.defineProperty( Array.prototype, "getLast", {
enumerable: false,
configurable: false,
writable: false,
value: function() {
return this[ this.length - 1 ];
}
} );
jQuery はこれをきれいに解決する:
> $([1,2,3]).get(-1)
3
> $([]).get(-1)
undefined
私は一般的に underscorejs を使います
if (_.last(loc_array) === 'index.html'){
etc...
}
私にとってはそれはloc_array.slice(-1)[0]
よりも意味的です
この質問は昔からありますので、最後の要素を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
これはarr[arr.length-1]
の2倍遅いですが、インデックスを使う必要はありません。それはいつでも金の価値があります。
私が試したソリューションのうち、arr[arr.length-1]
のExecution Time Unit(ETU)の倍数で、
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の比率のような何かを維持しています。それでも、リソースを独占するのが好きな人はいません。
個人的に私は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];
};
const lastElement = myArray[myArray.length - 1];
これはパフォーマンスの観点からは最良の選択肢です(arr.slice(-1)より約1000倍高速)。
Array
のすべてのインスタンスからアクセスできるように、新しい property getter を Array
_に追加できます。
ゲッターを使用すると、まるでそれがプロパティの値であるかのように、関数の戻り値にアクセスできます。もちろん、関数の戻り値は配列の最後の値です(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'
編集:
最近私はもう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()です。
ECMAScript提案ステージ1 最後の要素を返す配列プロパティを追加する提案があります: proposal-array-last 。
構文:
arr.lastItem // get last item
arr.lastItem = 'value' // set last item
arr.lastIndex // get last index
polyfill を使用できます。
提案者: Keith Cirkel ( chai autor)
私は、最も簡単で超効率の悪い方法は次のように考えています。
var array = ['fenerbahce','arsenal','milan'];
var reversed_array = array.reverse(); //inverts array [milan,arsenal,fenerbahce]
console.log(reversed_array[0]) // result is "milan".
私は、ヘルパー関数を作成して毎回それを再利用することをお勧めします、あなたはそれが必要です。最後の項目だけでなく、最後から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)));
配列の最後の項目を取得する簡単な方法:
var last_item = loc_array.reverse()[0];
もちろん、最初に配列に少なくとも1つの項目があることを確認する必要があります。
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>
ES6/ES2015拡散演算子(...)を使用すると、次のようにすることができます。
const data = [1, 2, 3, 4]
const [last] = [...data].reverse()
console.log(last)
スプレッド演算子とその逆を使って元の配列を変更しなかったことに注意してください。これは配列の最後の要素を取得する純粋な方法です。
URLから配列を取り出すことなくこの問題を解決できます
これは私の代わりです
var hasIndex = (document.location.href.search('index.html') === -1) ? doSomething() : doSomethingElse();
ご挨拶
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("."));
以下のようなものはどうでしょうか。
if ('index.html' === array[array.length - 1]) {
//do this
} else {
//do that
}
Underscore を使用する場合は、_.last()
を使用できます。
if ('index.html' === _.last(array)) {
//do this
} else {
//do that
}
これは清潔で効率的です。
let list = [ 'a', 'b', 'c' ]
(xs => xs[xs.length - 1])(list)
Babelを使ってパイプオペレーターをインストールすると、次のようになります。
list |> (xs => xs[xs.length - 1])
reverse()
を使わないでください。いくつかの回答ではreverse
に言及していますが、reverse
が元の配列を変更し、他の言語やフレームワークのようにコピーを返さないという事実については言及していません。
var animals = ['dog', 'cat'];
animals.reverse()[0]
"cat"
animals.reverse()[0]
"dog"
animals.reverse()[1]
"dog"
animals.reverse()[1]
"cat"
これはデバッグするのに最悪の種類のコードになる可能性があります。
このメソッドはあなたのプロトタイプを台無しにすることはありません。また、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'))
別のES6
専用オプションは、以下のようにArray.find(item, index)=> {...})
を使用することです。
const arr = [1, 2, 3];
const last = arr.find((item, index) => index === arr.length - 1);
実用的な価値はほとんどなく、インデックスがフィルタリングロジックにも利用できることを示すために投稿されています。
last
をArray.prototype
に追加するnpmモジュールもあります。
npm install array-prototype-last --save
使用法
require('array-prototype-last');
[1, 2, 3].last; //=> 3
[].last; //=> undefined
Originの配列から最後の要素を削除しないようにするには
Array.from(myArray).pop()
ほとんどのブラウザでサポートされています(ES6)
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
これは機能しますか?
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])));
}
矢印関数 は、配列の名前を繰り返さないことで、最も高速な方法をより簡潔にします。
var lastItem = (a => a[a.length - 1])(loc_array);
reduceRight :を使う
[3,2,1,5].reduceRight((a,v) => a ? a : v);
これは、 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