web-dev-qa-db-ja.com

配列に値が含まれているかどうかを確認

値が配列に存在するかどうかを判断する必要があります。

私は以下の機能を使用しています。

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] == obj) {
            return true;
        }
    }
    return false;
}

上記の関数は常にfalseを返します。

配列値と関数呼び出しは以下のとおりです。

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));
1262
Prasad
var contains = function(needle) {
    // Per spec, the way to identify NaN is that it is not equal to itself
    var findNaN = needle !== needle;
    var indexOf;

    if(!findNaN && typeof Array.prototype.indexOf === 'function') {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function(needle) {
            var i = -1, index = -1;

            for(i = 0; i < this.length; i++) {
                var item = this[i];

                if((findNaN && item !== item) || item === needle) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    return indexOf.call(this, needle) > -1;
};

あなたはこのようにそれを使うことができます:

var myArray = [0,1,2],
    needle = 1,
    index = contains.call(myArray, needle); // true

CodePenの検証/使用方法

990
eyelidlessness

jQuery これにはユーティリティ関数があります。

$.inArray(value, array)

value内のarrayのインデックスを返します。 arrayvalueを含まない場合は-1を返します。

も参照してください。JavaScriptで配列にオブジェクトが含まれているかどうかを確認するにはどうすればよいですか。

977
codeape

これは一般的にindexOf()メソッドの目的です。あなたは言うだろう:

return arrValues.indexOf('Sam') > -1
845
Gabriel Hurley

Array.prototype.includes()

ES2016では、 Array.prototype.includes() があります。

includes()メソッドは、配列が特定の要素を含むかどうかを判断し、必要に応じてtrueまたはfalseを返します。

["Sam", "Great", "Sample", "High"].includes("Sam"); // true

サポート

kangax および _ mdn _ によると、次のプラットフォームがサポートされています。

  • クローム47
  • エッジ14
  • Firefox 43
  • オペラ34
  • サファリ9
  • ノード6

サポートは Babelbabel-polyfillを使用)または core-js を使用して拡張できます。 MDNは polyfill も提供します。

if (![].includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}
331
Dale

lodash のようなライブラリを使用する方が、ブラウザ間の互換性と効率性に関するすべての問題のために、ほとんどの場合より安全です。

効率性いつでも、アンダースコアのような非常にポピュラーなライブラリが、このような効用関数を達成するための最も効率的な方法を持つことを保証できるので、効率性。

_.includes([1, 2, 3], 3); // returns true

ライブラリ全体を含めることによってアプリケーションに追加される一括処理が心配な場合は、機能を個別に含めることができます。

var includes = require('lodash/collections/includes');

注意: 古いバージョンのlodashでは、これは_.contains()ではなく_.includes()でした。

128
ncabral

tl; dr

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

function log(msg){
  $('#out').append('<div>' + msg + '</div>');  
}

var arr = [1, "2", NaN, true];
arr.includes = includes;

log('var arr = [1, "2", NaN, true];');
log('<br/>');
log('arr.includes(1): ' + arr.includes(1));
log('arr.includes(2): ' + arr.includes(2));
log('arr.includes("2"): ' + arr.includes("2"));
log('arr.includes(NaN): ' + arr.includes(NaN));
log('arr.includes(true): ' + arr.includes(true));
log('arr.includes(false): ' + arr.includes(false));
#out{
  font-family:monospace;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id=out></div>

長い回答

この質問は組み込みオブジェクトを拡張するかどうかに関するものではありませんが、OPの試みとこの回答に対するコメントはその議論を浮き彫りにします。 '13年2月12日からの私のコメントは、この議論を非常にうまく説明している記事を引用していますが、そのリンクが壊れ、時間が過ぎたため元のコメントを編集できないので、それを含めます here

組み込みのArrayオブジェクトをcontainsメソッドで拡張する場合、おそらくこれを行うための最良かつ最も責任のある方法は、 MDN 。 (また、プロトタイプの継承に関するMDN記事の this セクションを参照してください。」を説明しています。組み込みプロトタイプを拡張する唯一の正当な理由は、新しいJavaScriptの機能をバックポートすることですエンジン。Array.forEachなど。 "

if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

厳密な平等を望まない、または選択したいですか?

function includes(k, strict) {
  strict = strict !== false; // default is true
  // strict = !!strict; // default is false
  for(var i=0; i < this.length; i++){
    if( (this[i] === k && strict) || 
        (this[i] == k && !strict) ||
        (this[i] !== this[i] && k !== k)
    ) {
      return true;
    }
  }
  return false;
}
46
Trevor

ECMAScript6以降、 Set を使用できます。

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
41
Nicolas

私の小さな貢献:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

//usage
if(isInArray(my_array, "my_value"))
{
    //...
}
21
Matías Cánepa

ECMA 5にアクセスできる場合は、 some メソッドを使用できます。

MDN SOMEメソッドリンク

arrValues = ["Sam","Great", "Sample", "High"];

function namePresent(name){
  return name === this.toString();
}
// Note:
// namePresent requires .toString() method to coerce primitive value
// i.e. String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"}
// into
// "Sam"

arrValues.some(namePresent, 'Sam');
=> true;

ECMA 6にアクセスできる場合は、 includes メソッドを使用できます。

MDNに含まれるメソッドリンク

arrValues = ["Sam","Great", "Sample", "High"];

arrValues.includes('Sam');
=> true;
17
SoEzPz

IEのindexOfの実装があるとします(まぶたのないさで説明されているとおり)。

Array.prototype.contains = function(obj) {
    return this.indexOf(obj) > -1;
};
17
rlovtang

_.indexOf method を使用することができます。または、Underscore.jsライブラリ全体をアプリに含めたくない場合は、 外観を確認することができます そして必要なコードを抽出します。 。

    _.indexOf = function(array, item, isSorted) {
    if (array == null) return -1;
    var i = 0, l = array.length;
    if (isSorted) {
      if (typeof isSorted == 'number') {
        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
      } else {
        i = _.sortedIndex(array, item);
        return array[i] === item ? i : -1;
      }
    }
    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
    for (; i < l; i++) if (array[i] === item) return i;
    return -1;
  };
11

別の選択肢は、以下のようにArray.some利用可能なら )を使うことです。

Array.prototype.contains = function(obj) {
  return this.some( function(e){ return e === obj } );
}

Array.someに渡された無名関数は、配列内にtrueと同一の要素がある場合に限り、objを返します。そのような要素がなければ、関数は配列のどの要素に対してもtrueを返さないので、Array.somefalseも返します。

9
Hunan Rostomyan

うわー、この質問にはたくさんの素晴らしい答えがあります。

reduceアプローチをとるものは見たことがないので、それを追加します。

var searchForValue = 'pig';

var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){
    return previous || searchForValue === current ? true : false;
}, false);

console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray);

これが動作中のフィドルです

7
Chris Schmitz

配列内のすべての値に対して関数を実行するarray .map関数を使用することは、私にとって最もわかりやすいようです。

参照: Array.prototype.map()

このメソッドは、単純な配列と、キー/値がオブジェクトの配列に存在するかどうかを確認する必要があるオブジェクトの配列の両方に適しています。

function inArray(myArray,myValue){
    var inArray = false;
    myArray.map(function(key){
        if (key === myValue){
            inArray=true;
        }
    });
    return inArray;
};

var anArray = [2,4,6,8]
console.log(inArray(anArray, 8)); // returns true
console.log(inArray(anArray, 1)); // returns false

function inArrayOfObjects(myArray,myValue,objElement){
    var inArray = false;
    myArray.map(function(arrayObj){
        if (arrayObj[objElement] === myValue) {
            inArray=true;
        }
    });
    return inArray;
};

var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}]
console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true
console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true
console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false
4
Ian Vasquez

提供された答えは私のために働かなかった、しかしそれは私に考えを与えた:

Array.prototype.contains = function(obj)
    {
        return (this.join(',')).indexOf(obj) > -1;
    }

グループ化を超えて同じ項目が一致する可能性があるため、完璧ではありません。私の例のように

var c=[];
var d=[];
function a()
{
    var e = '1';
    var f = '2';
    c[0] = ['1','1'];
    c[1] = ['2','2'];
    c[2] = ['3','3'];
    d[0] = [document.getElementById('g').value,document.getElementById('h').value];

    document.getElementById('i').value = c.join(',');
    document.getElementById('j').value = d.join(',');
    document.getElementById('b').value = c.contains(d);
}

それぞれ1と2を含む 'g'フィールドと 'h'フィールドを指定してこの関数を呼び出すと、結合の結果の文字列は1,1,2,2,3,3なので、まだこの関数が見つかります。

このような状況に遭遇するのは私の状況では疑わしいので、これを使用します。他の誰かが選択した答えを機能させることができなかったとしても私は共有すると思いました。

4
Kakoroat
function setFound(){   
 var l = arr.length, textBox1 = document.getElementById("text1");
    for(var i=0; i<l;i++)
    {
     if(arr[i]==searchele){
      textBox1 .value = "Found";
      return;
     }
    }
    textBox1 .value = "Not Found";
return;
}

このプログラムは与えられた要素が見つかったかどうかをチェックします。 Id text1はテキストボックスのIDを表し、searcheleは検索対象の要素を表します(ユーザーから取得)。インデックスが必要な場合は、i値を使用してください。

2
deeban

contains関数に対する最も簡単な解決策は、次のような関数です。

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
}

理想的には、これをスタンドアロン関数にするのではなく、ヘルパーライブラリの一部にします。

var helper = {};

helper.array = {
    contains : function (haystack, needle) {
        return !!~haystack.indexOf(needle);
    }, 
    ...
};

さて、あなたがたまたまIE <9をサポートする必要があり、そのためindexOfに頼ることができない不運な人々の一人であるなら、あなたはこれを使うことができます polyfill 、MDNから

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }
    var o = Object(this);
    var len = o.length >>> 0;
    if (len === 0) {
      return -1;
    }
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }
    if (n >= len) {
      return -1;
    }
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}
1
John Slegers