Pertanyaan Tentukan apakah suatu larik berisi nilai [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya perlu menentukan apakah suatu nilai ada dalam array.

Saya menggunakan fungsi berikut:

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

Fungsi di atas selalu mengembalikan false.

Nilai-nilai array dan fungsi panggilan adalah sebagai berikut:

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));

1148
2017-07-25 08:18


asal


Jawaban:


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

Anda dapat menggunakannya seperti ini:

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

Validasi / penggunaan KodePen


949
2017-07-25 08:22



jQuery memiliki fungsi utilitas untuk ini:

$.inArray(value, array)

Mengembalikan indeks value di array. Pengembalian -1 jika array tidak mengandung value.

Lihat juga Bagaimana cara memeriksa apakah suatu array memasukkan objek dalam JavaScript?


927
2017-09-24 19:34



Ini umumnya apa metode indexOf () untuk. Anda akan berkata:

return arrValues.indexOf('Sam') > -1

745
2017-07-25 08:25



Array.prototype.includes ()

Di ES2016, ada Array.prototype.includes().

Itu includes() metode menentukan apakah suatu array termasuk elemen tertentu, kembali true atau false sewajarnya.

Contoh

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

Mendukung

Menurut kangax dan MDN, platform berikut ini didukung:

  • Chrome 47
  • Edge 14
  • Firefox 43
  • Opera 34
  • Safari 9
  • Simpul 6

Dukungan dapat diperluas menggunakan Babel (menggunakan babel-polyfill) atau core-js. MDN juga menyediakan 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;
  };
}

246
2018-06-09 06:45



Hampir selalu lebih aman untuk menggunakan perpustakaan seperti lodash hanya karena semua masalah dengan kompatibilitas lintas-browser dan efisiensi.

Efisiensi karena Anda dapat dijamin bahwa pada waktu tertentu, perpustakaan yang sangat populer seperti garis bawah akan memiliki metode yang paling efisien untuk mencapai fungsi utilitas seperti ini.

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

Jika Anda khawatir tentang massal yang ditambahkan ke aplikasi Anda dengan menyertakan seluruh pustaka, ketahuilah bahwa Anda dapat menyertakan fungsi secara terpisah:

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

MELIHAT: Dengan versi lodash yang lebih lama, ini _.contains() daripada _.includes().


116
2018-01-25 03:00



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

Contoh

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>

Jawaban yang Lebih Panjang

Saya tahu pertanyaan ini tidak benar-benar tentang apakah atau tidak untuk memperluas objek built-in, tetapi upaya OP dan komentar pada jawaban ini menyoroti perdebatan itu. Komentar saya dari 12 Feb, '13 mengutip artikel yang menguraikan debat ini dengan sangat baik, namun tautan itu rusak dan saya tidak dapat mengedit komentar asli karena terlalu banyak waktu berlalu, jadi saya memasukkannya sini.

Jika Anda ingin memperpanjang built-in Array objek dengan contains metode, mungkin cara terbaik dan paling bertanggung jawab untuk melakukan ini adalah menggunakan polyfill ini MDN. (Lihat juga ini bagian dari artikel MDN tentang warisan Prototipikal, yang menjelaskan hal itu "Satu-satunya alasan yang baik untuk memperluas prototipe built-in adalah untuk mendukung fitur-fitur mesin JavaScript yang lebih baru; misalnya Array.forEach, dll.")

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

Tidak ingin kesetaraan yang ketat, atau ingin memilih?

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
2017-09-15 20:03



Karena ECMAScript6, seseorang dapat menggunakannya Set:

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

32
2018-01-07 13:05



Kontribusi kecil saya:

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

//usage
if(isInArray(my_array, "my_value"))
{
    //...
}

18
2017-09-13 17:29