JavaScript อยู่ในอาร์เรย์


152

สมมติว่าฉันมีสิ่งนี้:

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

มีองค์ประกอบอาเรย์มากกว่า แต่มีเพียงไม่กี่อย่างเท่านั้นที่อ่านได้ อย่างไรก็ตามฉันสามารถทำลูป "สำหรับ" ได้ แต่จะทำลูป 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 และเท็จหากผลลัพธ์ === -1
bm_i

11
@bm_i เร็วกว่าไหน พิมพ์เร็วกว่าไหม
alex

1
indexOf()if (-1 == [84, 116].indexOf(event.keyCode))นอกจากนี้ยังสามารถนำมาใช้ในอาร์เรย์ที่แท้จริงเช่น ทดสอบกับ Chrome 37.0.2062.122
François

2
FWIW indexOf(…) >= 0ผมใช้เสมอ ทำให้ไม่มีความแตกต่างและฉันลืมที่ฉันหยิบมันขึ้นมาเป็นนิสัย
JSDBroughton

49

ดังที่ได้กล่าวมาก่อนหากเบราว์เซอร์ของคุณรองรับindexOf()ได้ดี ถ้าไม่ได้คุณจะต้อง pollyfil หรือพึ่งพาเข็มขัดสาธารณูปโภคเช่นlodash / ขีด

แค่ต้องการเพิ่มการเพิ่ม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

12

ใช้Underscore.js

มันเป็นไปตามเบราว์เซอร์และสามารถทำการค้นหาแบบไบนารีหากข้อมูลของคุณถูกจัดเรียง

_.indexOf

_.indexOf (อาร์เรย์, ค่า, [isSorted]) ส่งคืนดัชนีที่สามารถพบค่าในอาร์เรย์หรือ -1 ถ้าไม่มีค่าในอาร์เรย์ ใช้ฟังก์ชัน indexOf เนทีฟเว้นแต่ว่ามันหายไป หากคุณทำงานกับอาเรย์ขนาดใหญ่และคุณรู้ว่าอาเรย์นั้นได้ถูกเรียงลำดับแล้วให้ส่งผ่านค่าจริงสำหรับ 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;
  };
}

แหล่ง


เราไม่สามารถใช้ ('118' ในบล็อกTile) ใน javascript ได้หรือไม่
prabhat mishra

1
@ prabhatmishra ที่สามารถตรวจสอบได้เฉพาะกุญแจเท่านั้น
alex

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

พารามิเตอร์แรกคือสิ่งที่คุณกำลังค้นหา พารามิเตอร์ที่สองคือตำแหน่งดัชนีในอาร์เรย์นี้ที่จะเริ่มการค้นหา

หากคุณจำเป็นต้องอยู่ที่นี่ - มีคำตอบที่เป็นมรดกมากมาย


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

มีการอ้างอิงบางอย่างที่นี่ พวกเขายังมี Polyfill สำหรับข้างต้น


ระวังเมื่อคุณใช้สิ่งนี้ Array.includes()เปิดตัวใน ES7 (ECMAScript 2017) และจะไม่ทำงานกับเบราว์เซอร์รุ่นเก่า developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

3

ขึ้นอยู่กับเวอร์ชันของ JavaScript ที่คุณมีคุณสามารถใช้indexOf:

ส่งคืนดัชนีแรกที่องค์ประกอบที่กำหนดสามารถพบได้ในอาร์เรย์หรือ -1 ถ้ามันไม่อยู่

หรือsome:

ทดสอบว่าองค์ประกอบบางอย่างในอาร์เรย์ผ่านการทดสอบที่ใช้โดยฟังก์ชันที่มีให้หรือไม่

แต่ถ้าคุณทำแบบนี้ตรวจสอบว่าคุณควรใช้ Object ในการจัดเก็บสายอักขระของคุณ (หรืออาจเป็นวัตถุหรือ Array ขึ้นอยู่กับสิ่งที่คุณทำกับข้อมูลของคุณ)


3

ฉันจะใช้โครงสร้างข้อมูลที่แตกต่างกันเนื่องจาก array ดูเหมือนจะไม่ใช่ทางออกที่ดีที่สุด

แทนที่จะใช้อาร์เรย์ให้ใช้วัตถุเป็นตารางแฮชเช่น:

(โพสต์ใน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 Hashtable"


3

IMHO ส่วนใหญ่เข้ากันได้กับเบราว์เซอร์รุ่นเก่า

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 copy เป็นสตริง CSV คุณสามารถทดสอบสตริงในเบราว์เซอร์รุ่นเก่าได้


3
สิ่งนี้จะเป็นผลบวกหากสมาชิกอาเรย์คนใดมีเข็มอยู่ เช่นจะกลับมา['Lemon Pie'].inArray('Lemon') Trueคุณอาจใช้เข็ม,ล้อมรอบหรือใช้การจับคู่ regex เพื่อทำเช่นเดียวกัน แต่การเข้าร่วมจะดีกว่าการใช้บางสิ่งที่คลุมเครือมากกว่า,เหตุผลเท็จที่คล้ายกัน ( |พูด) มันขึ้นอยู่กับชุดข้อมูล
JSDBroughton

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
แม้ว่าข้อมูลโค้ดนี้อาจช่วยแก้ปัญหาได้ แต่ก็ไม่ได้อธิบายว่าทำไมหรือตอบคำถามอย่างไร โปรดระบุคำอธิบายสำหรับรหัสของคุณเนื่องจากช่วยปรับปรุงคุณภาพการโพสต์ของคุณได้อย่างแท้จริง จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ ผู้ตั้งค่าสถานะ / ผู้ตรวจทาน: สำหรับคำตอบที่ใช้รหัสอย่างเช่น downvote อย่าลบ!
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'); }

ตรวจสอบ arr.length ถ้ามากกว่า 0 หมายความว่ามีสตริงอยู่หรือไม่ใช่สตริง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.