配列の最初の要素を取得するにはどうすればよいですか?


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であることを前提としています。仮定について何を言っているか知っています...
Andy

16
@Andy OPの質問は非常に明確で具体的だったため、仮定はありませんでした。
John Hartsock

5
@ペタそのコードには何も問題はありません。それは単にundefinedを示しています。これは、実際には配列の最初の項目であるa [0]の値だからです。fooを表示する場合は、未定義の値をすべてスキップする必要がありますが、配列の最初の項目にはなりません。
Michiel van der Blonk

5
@MichielvanderBlonk私は、一部のユーザーが予期しない可能性のあるエッジケースを指摘していました。
Petah 2016


92

さまざまな状況でのいくつかの方法を以下に示します。

ほとんどの場合、最初の要素にアクセスする最も簡単な方法は、

yourArray[0]

ただし、[0]が実際に存在するかどうかを確認する必要があります。

元の配列を気にせず、インデックスが存在するかどうかを確認したくない、最初の要素または未定義のインラインを取得したいという現実の場合があります。

この場合、shift()メソッドを使用して最初の要素を取得できますが、このメソッドは元の配列を変更します(最初の項目を削除してそれを返します)。したがって、配列の長さは1だけ減ります。このメソッドは、最初の要素を取得するだけで元の配列を気にする必要がないインラインの場合に使用できます。

yourArray.shift()

知っておくべき重要なことは、上記の2つは、配列が[0]インデックスで始まる場合のオプションにすぎないということです。

たとえば、yourArray [0]を削除して最初の要素が削除され、配列に「穴」が残る場合があります。ここで、[0]の要素は単に未定義ですが、最初の「既存の」要素を取得したいとします。私はこれについて多くの実世界の事例を見てきました。

したがって、配列と最初のキーの知識がない(または穴があることがわかっている)と仮定しても、最初の要素を取得できます。

find()を使用して、最初の要素を取得できます。

find()の利点は、条件を満たす最初の値に達したときにループを終了するときの効率です(これについては以下で詳しく説明します)。(条件をカスタマイズして、nullまたは他の空の値を除外することもできます)

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

また、最初にコピーの配列を「修正」し、元の配列をそのまま(変更なし)に保ちながら最初の要素を取得するオプションとして、filter()をここに含めたいと思います。

ここにfilter()を含めるもう1つの理由は、find()より前に存在し、多くのプログラマーが既にそれを使用しているためです(find()がES6であるのに対してES5です)。

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

filter()は実際には効率的な方法ではなく(filter()はすべての要素を実行する)、別の配列を作成することを警告します。たとえばforEachの使用に近いほど、パフォーマンスへの影響はわずかなので、小さなアレイで使用することは問題ありません。

(私は何人かの人々は最初の要素を取得するために、ループの中で...のために使用することをお勧めしますが、私はこの方法に対して推薦見るため...インデックスの順序が重要である配列を反復するために使用すべきではありませんで、それはdoesnのために」ブラウザーはほとんどの順序を尊重すると主張できますが、tは順序を保証します。ループし、キー/値をチェックする

find()とfilter()はどちらも要素の順序を保証するため、上記のように使用しても安全です。


1
後で配列をシフト解除しないでください。例:var element = yourArray.shift(); yourArray.unshift(element);
グレッグ

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]
Michael J. Zoidl 2017

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]はそれを行う必要があります:)
Edson Medina

1
これは、配列のメンバーではなくオブジェクトを列挙するため、配列の列挙にはそのような種類を使用しないでください。代わりに、従来のforループでインデックスを使用してください。
Oskar Duveborn 2013

同様の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 2014年

11
それはばかげ.first()てい[0]ます、タイプすることは行うよりも優れていますか?
jonschlinkert 2014年

10
@jonschlinkert一部の言語には、で始まるインデックスがあります1firstその場合は明確です。
Bartek Banachewicz 2014年

6
[] .first()は何を返しますか?
Rhyous、2015年

1
私のテストでは未定義を返します。私はそれが未定義を返すのが好きかどうかを決定しようとしています。
Rhyous、2015年

33

あなたはただ使うことができますfind()

let first = array.find(Boolean);

または、最初の要素間違っていても必要な場合:

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

さらに一歩進む:

読みやすさを重視するが、数値の発生率に依存したくない場合は、組み込みのArrayオブジェクトプロトタイプを直接変更することの落とし穴を軽減するように定義することにより、- first()関数を追加できます(ここで説明します)。Array.protoypeObject​.define​Property()

パフォーマンスはかなり良好です(find()最初の要素の後で停止します)が、完璧ではなく、普遍的にアクセスできるわけでもありません(ES6のみ)。詳細については、@ Selaysの回答をご覧ください

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
これが最良かつ最新の回答です。私も同じようにここに投稿しようとしましたが、あなたのものを見た後:)
コスタノス

そして、言語の将来のバージョンでfind()を追加するとどうなりますか?:-)上記のスニペットはそれを壊しませんか?
ボグダン

@Bogdan 彼らはいつ追加するのfind()ですか?find()言語の一部でした。これが、上記のスニペットが機能する理由です。
leonheess

おお。少し疲れて申し訳ありませんが、私が最初に言及したことがあまりありませんでした。
Bogdan

@ボグダンそれはまだ完全にうまく機能しますが、潜在的な将来を上書きしますfirst()
レオニース

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とスパース配列のアカウントを使用する私が見る最も簡潔なソリューションです。
ドミニクP


1
!!element偽の値をスキップするので、使用しないことをお勧めします。私find()はこのように使用することをお勧めします:sparse.find((_, index, array) => index in array);
ビクターウェリング2018

ここで偽の値を無視しない同様のアプローチ:stackoverflow.com/a/56115413/7910454
leonheess

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

「検索」は、フィルタに一致する最初の要素を返します&& !!e任意の要素に一致します。

なお、 最初の要素は「Falsy」でない場合にのみ動作します:nullfalseNaN""0undefined


1
他のユーザーを明確にするための不条理、条件が真実の要素と一致する、つまり<code> const example = [null、NaN、0、undefined、{}、3、 'a']; const firstTruthyElement = example.find(e => !! e); // 5番目の要素、最初の偽ではない要素を割り当てます:{} </ code>
PDA

追いついてくれて@PDAに感謝します。ところで、空の文字列も偽物と見なされます
Abdennour TOUMI '19 / 09/19

3
これはすばらしいことであり、TypeScriptでもうまく機能します。単純化するのはarray.find(() => true);どうですか?これにより[false].find(() => true)、同様に行うことができます。
Simon Warta

当然の@SimonWartaは.find(value => true)ちょうど期待どおりに動作し...正直なところ、あなたがクリーンなコードとtypescriptですでタイピングを保つためにしたい場合は、使用される非構造を
Flavien Volken 2018年

偽の要素を無視するという落とし穴のない同様の方法については、この回答を参照してください
leonheess



7

他の言語からJavaScriptに来て、配列の最初の要素のようなものを探し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

フィルターを使用して配列の最初の要素を検索します。

typescriptの場合:

function first<T>(arr: T[], filter: (v: T) => boolean): T {
    let result: T;
    return arr.some(v => { result = v; return filter(v); }) ? result : undefined;
}

プレーンなJavaScriptでは:

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

同様に、indexOf:

typescriptの場合:

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

プレーンなJavaScriptでは:

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

3

複数の一致がある場合、jqueryに指定されたcssセレクターに一致した最初のDOM要素をフェッチするために、JQueryの.first()が使用されます。

JavaScript配列を操作するために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

これを使用して、JavaScriptで文字を分割します。

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

1

前の例は、配列インデックスがゼロから始まる場合にうまく機能します。thomaxの答えは、ゼロから始まるインデックスに依存して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、無何もないです..:配列のインデックスはゼロから開始されない場合P..itは動作しますが、それは動作しますが、世界....終了していない場合
メラク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()、マップなしでオリジナルを変更します。この場合は、..[0]バージョンを提案します)。


0
var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

console.log(Object.keys(ary)[0]);

Object配列(req)を作成し、Object配列Object.keys(req)[0]の最初のキーを選択するだけです。


2
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
DimaSan 2017

0

@thomaxの答えはかなり良いですが、配列の最初の要素がfalseまたはfalse-y(0、空の文字列など)の場合は失敗します。undefined以外の場合は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、未定義、false、0、または空の文字列の場合、その文字列はスキップされます。試してみる:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken

良い点は、私の解決策は定義された値を持つ配列に対してのみ機能することです。
JanJarčík、2018年

1
それでは、なぜ値を使用してフィルタリングするのですか?a.find(value => true)値は無視されません。それでも、findを使用して最初のアイテムを取得することはお勧めしません。
Flavien Volken

1
@ MiXT4PEが(あなたの答えのように)trueを返すのは問題ありません。最初の要素で停止し、ここでは要素自体を返します。それがfalseと見なされた場合に続行されます
Flavien Volken

1
「検索」を使用する@ MiXT4PEは、速度が遅く、複雑でエレガントではありません。また、この操作をリファクタリングできるスマートエディタがあるとは思えません。分解を使用する方がはるかに効率的であり、言語によって理解されるため(リファクタリングが可能)、型はコンパイラによって理解され(TSの場合)、おそらく最速のソリューションです。
Flavien Volken
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.