JavaScriptは配列にあります


152

私がこれを持っているとしましょう:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

配列要素は他にもありますが、読みやすくするためにそれらはほんの一部です。とにかく、「for」ループを実行できますが、マップをクリックするたびに500ループします...特定の文字列が配列内にあるかどうかを確認する他の方法はありますか?

回答:


247

これを試して:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}

24
これは古いブラウザー(IE <9など)では機能しません。これにはjQuery関数があります:api.jquery.com/jQuery.inArray
Vinicius Pinto

5
より速い方法は、ビット単位でフリップすることです。if(!!~blockedTile.indexOf('118))このメソッドは、結果> -1の場合は常にtrueを返し、結果=== -1の場合はfalseを返します
bm_i

11
@bm_iどっちが速い?タイプするのが速い?
アレックス2013年

1
indexOf()リテラル配列などにも適用できますif (-1 == [84, 116].indexOf(event.keyCode))。Chrome 37.0.2062.122でテスト済み。
フランソワ

2
fwiwいつも使っていますindexOf(…) >= 0。違いはなく、習慣としてそれを拾った場所を忘れます
JSDBroughton 2016年

49

前述のとおり、ご使用のブラウザがをサポートしている場合はindexOf()、そうでない場合は、それをポリフィルするか、lodash / underscoreなどのユーティリティベルトに依存する必要があります

この新しいES2016の追加を追加したかっただけです(この質問を最新の状態に保つため):

Array.prototype.includes()

if (blockedTile.includes("118")) {
    // found element
}

12
function in_array(needle, haystack){
    var found = 0;
    for (var i=0, len=haystack.length;i<len;i++) {
        if (haystack[i] == needle) return i;
            found++;
    }
    return -1;
}
if(in_array("118",array)!= -1){
//is in array
}

2
OPはループを望んでいませんでした
JNF 2014年

12

Underscore.jsを使用する

これは、クロスブラウザ対応し、データがソートされている場合、バイナリ検索を行うことができます。

_。の指標

_.indexOf(array、value、[isSorted])配列で値が見つかるインデックスを返します。配列に値が存在しない場合は-1を返します。欠落していない限り、ネイティブのindexOf関数を使用します。大規模な配列を使用していて、配列が既に並べ替えられていることがわかっている場合は、trueをisSortedに渡して、より高速なバイナリ検索を使用します。

//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
    alert('true');
}else{
    alert('false');   
}

//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
    alert('true');
}else{
    alert('false');   
}

11

一部のブラウザはをサポートしていArray.indexOf()ます。

そうでない場合は、Arrayプロトタイプを使用してオブジェクトを拡張できます...

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n) // shortcut for verifying if it's NaN
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

ソース


JavaScriptで(blockedTileの '118')を使用できませんか?
プラバットミシュラ2018年

1
@prabhatmishraキーをチェックするだけです。
アレックス

9

好みに合わせて使用​​してください:

var blockedTile = [118, 67, 190, 43, 135, 520];

// includes (js)

if ( blockedTile.includes(118) ){
    console.log('Found with "includes"');
}

// indexOf (js)

if ( blockedTile.indexOf(67) !== -1 ){
    console.log('Found with "indexOf"');
}

// _.indexOf (Underscore library)

if ( _.indexOf(blockedTile, 43, true) ){
    console.log('Found with Underscore library "_.indexOf"');
}

// $.inArray (jQuery library)

if ( $.inArray(190, blockedTile) !== -1 ){
    console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>



6

2019年にそれを行う最良の方法は、使用することです .includes()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false

最初のパラメータはあなたが探しているものです。2番目のパラメーターは、検索を開始するこの配列のインデックス位置です。

ここでクロスブラウジングをする必要がある場合-従来の答えはたくさんあります。


1
includes溶液を中に複製されKutyel(2016)、СергейСавельев(2017)とKrunal Limbad ...(2018)も同様に詳細な実施例及び参照と回答
CPHPython

4

すでに上記に回答しましたが、共有したかったです。

IEでは機能しません。@Mahmoudに言及してくれてありがとう

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

ここにいくつかの参照を得ました。彼らはまた、上記のポリフィルを持っています。


これを使用するときは注意してください。Array.includes()ES7(ECMAScript 2017)で導入され、古いブラウザでは動作しません。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…–
uxcode

3

使用可能なJavaScriptのバージョンに応じて、以下を使用できますindexOf

配列内で指定された要素が見つかる最初のインデックスを返します。存在しない場合は-1を返します。

またはsome

配列内の一部の要素が、提供された関数によって実装されたテストに合格するかどうかをテストします。

ただし、このような存在チェックを頻繁に行う場合は、オブジェクトを使用して文字列(または、データと何をしているのかに応じて、オブジェクトと配列)を格納する方がよいでしょう。


3

配列は最適なソリューションではないようなので、別のデータ構造を使用します。

次のように、配列の代わりに、オブジェクトをハッシュテーブルとして使用します。

jsbinにも投稿されています

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

コンソール出力:

x exists? - yes
a exists? - no

これは簡単な解決策です。オブジェクト指向のアプローチにもっと興味がある場合は、Googleで「jsハッシュテーブル」を検索してください。


3

古いブラウザと最も互換性のある私見

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

ArrayコピーをCSV文字列に変換することで、古いブラウザで文字列をテストできます。


3
配列メンバーのいずれかに針が含まれているが、それだけではない場合、これは偽陽性になります。例:['Lemon Pie'].inArray('Lemon')戻りTrueます。あなたは,それを回避するために針をラップするか、正規表現マッチングを使用して同様に行うことができますが、結合は,同様の偽陽性の理由よりも曖昧なものを使用することが好ましいでしょう(|例えば)。データセットによって異なります
JSDBroughton 2016年

1

Array.filterを使用しないのはなぜですか?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

それをコードにコピーするだけで、次のようになります。

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}

0

配列の例では、php(in_array)でも同じです

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }

0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false

4
コードの一部を投稿することは答えではありません。その上に説明を追加する必要があります。
xoxel

1
このコードスニペットは問題を解決する可能性がありますが、なぜまたはどのように質問に答えるかは説明していません。コードの説明を含めてください。これは、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。 報告者/レビュアー: このようなコードのみの回答の場合は、投票しないでください。削除しないでください。
Luca Kiebel

を使用することを提案するいくつかの回答がすでにありますincludes。この回答は、それらと比較して追加の値をどのように提供しますか?
Boghyon Hoffmann

0

以下のコードを試すことができます。http://api.jquery.com/jquery.grep/を確認してください

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

0より大きい場合はarr.lengthをチェックして、文字列が存在することを意味します。それ以外の場合は存在しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.