วิธีการ indexOf ในอาร์เรย์วัตถุ?


512

วิธีที่ดีที่สุดในการรับดัชนีของอาร์เรย์ซึ่งมีวัตถุคืออะไร

ลองนึกภาพสถานการณ์นี้:

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

ตอนนี้ฉันต้องการที่จะมีindexOfวัตถุซึ่งhelloทรัพย์สินซึ่งในตัวอย่างนี้จะเป็น'stevie'1

ฉันเพิ่งสมัครใหม่กับ JavaScript และฉันไม่รู้ว่ามีวิธีง่าย ๆ หรือถ้าฉันควรสร้างฟังก์ชั่นของตัวเองเพื่อทำเช่นนั้น


1
คุณต้องการที่จะรวมสองวัตถุhelloและqaz?
Armin

ไม่ฉันทำไม่ได้ ฉันต้องการมีรายการวัตถุในอาร์เรย์
อันโตนิโอลากูน่า

อ่าโอเค! คุณต้องการทราบตำแหน่งของวัตถุทั้งหมดในอาเรย์ซึ่งมีคุณสมบัติที่กำหนดไว้
Armin

10
ฉันพบฟังก์ชันที่ง่ายมากในการแก้ปัญหาที่แน่นอนด้วยคำตอบ SO นี้: var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos]; [ลิงค์] ( stackoverflow.com/a/16100446/1937255 )
Rick

ES6 Array.indexOf ดีกว่าคำตอบที่ยอมรับได้ (ถ้า ES6 เหมาะกับคุณ) - ดูตัวอย่างเต็มรูปแบบด้านล่าง
yar1

คำตอบ:


1043

ฉันคิดว่าคุณสามารถแก้มันในหนึ่งบรรทัดโดยใช้ฟังก์ชั่นแผนที่ :

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

58
นี่เป็นคำตอบที่ได้รับการยอมรับอย่างสุจริต เบราว์เซอร์ส่วนใหญ่ในปัจจุบันสนับสนุนArray.prototype.map()
AlbertEngelB

10
ไม่รองรับ IE8 แต่ถ้าไม่ใช่ปัญหานี่เป็นทางออกที่ดีที่สุด
Antonio Laguna

57
อืม ... มันไม่คุ้มค่าใช่หรือไม่ที่ Array.prototype.map () สร้างอาร์เรย์ใหม่ทั้งหมดที่มีรายการที่แมป ดังนั้นถ้าคุณมีอาร์เรย์ที่มีองค์ประกอบ 1,000 รายการคุณได้สร้างอาร์เรย์อีกหนึ่งองค์ประกอบที่มี 1,000 องค์ประกอบก่อนจากนั้นจึงค้นหา มันจะคุ้มค่าที่ฉันคิดว่าจะเห็นประสิทธิภาพของวิธีนี้เทียบกับการวนรอบแบบง่าย ๆ โดยเฉพาะอย่างยิ่งเมื่อคุณทำงานบนแพลตฟอร์มมือถือที่มีทรัพยากร จำกัด
ดั๊ก

7
@Doug แม้ว่าจุดของคุณเกี่ยวกับประสิทธิภาพถูกต้องใครในใจที่ถูกต้องของพวกเขาจะแทนที่หนึ่งบรรทัดของรหัสด้วยเจ็ดสำหรับแอปพลิเคชันที่เกือบตามนิยาม IO / เครือข่ายที่ถูกผูกไว้จนกว่าพวกเขาจะประวัติสำหรับคอขวด?
เจเร็ดสมิ ธ

6
ในทางเทคนิคแล้วไฟล์ js ที่ย่อเล็กสุดก็เป็นหนึ่งบรรทัด; D
GreaterKing

371

Array.prototype.findIndexรองรับเบราว์เซอร์ทั้งหมดที่ไม่ใช่ IE (ไม่ใช่ขอบ) แต่polyfillที่จัดไว้ให้เป็นสิ่งที่ดี

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

การแก้ปัญหาด้วยแผนที่ก็โอเค แต่คุณวนซ้ำทุกการค้นหา นั่นเป็นเพียงกรณีที่แย่ที่สุดสำหรับfindIndexซึ่งจะหยุดซ้ำเมื่อพบการแข่งขัน


ไม่มีทางที่รัดกุมจริงๆ (เมื่อ devs ต้องกังวลเกี่ยวกับ IE8)แต่นี่เป็นวิธีการทั่วไป:

var searchTerm = "stevie",
    index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
    if (myArray[i].hello === searchTerm) {
        index = i;
        break;
    }
}

หรือเป็นฟังก์ชั่น:

function arrayObjectIndexOf(myArray, searchTerm, property) {
    for(var i = 0, len = myArray.length; i < len; i++) {
        if (myArray[i][property] === searchTerm) return i;
    }
    return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1

เพียงบันทึกบางส่วน:

  1. อย่าใช้สำหรับ ... ในลูปในอาร์เรย์
  2. อย่าลืมลูปหรือกลับออกจากฟังก์ชั่นเมื่อคุณพบ "เข็ม" ของคุณ
  3. ระวังความเสมอภาคของวัตถุ

ตัวอย่างเช่น,

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found

ฟังก์ชั่นที่มีการผิด SEARCHTERM comparation ที่ควรจะเป็น SEARCHTERM :)
อันโตนิโอลากูน่า

มีหลายครั้งที่เกิดขึ้น
โจ

3
@SteveBennett เป็นรุ่นที่ปรับปรุงประสิทธิภาพ ความยาวของอาร์เรย์ต้องถูกกำหนดเพียงครั้งเดียว (เมื่อตัวแปรสำหรับ for-loop ถูกเตรียมใช้งาน) ในกรณีของคุณความยาวจะถูกตรวจสอบซ้ำทุกครั้ง ดูเพิ่มเติมที่stackoverflow.com/questions/5349425/… และstackoverflow.com/questions/8452317// อย่างไรก็ตามหากประสิทธิภาพการทำงานนั้นไม่สูงมาก
คนละ

1
คำตอบที่ดี แต่ฉันทำการเปรียบเทียบประสิทธิภาพ (ดูjsperf.com/find-index-of-object-in-array-by-contents ) และพบว่าคำตอบตามฟังก์ชั่นที่กล่าวถึงที่นี่น่าจะเป็นคำตอบที่มีประสิทธิภาพมากที่สุดอันดับสอง สิ่งเดียวที่ปลาย performant ขึ้นถูกใส่ลงในต้นแบบแทนเพียงฟังก์ชั่นที่กล่าวไว้ในคำตอบของฉัน
Uniphonic

123

ใน ES2015 มันค่อนข้างง่าย:

myArray.map(x => x.hello).indexOf('stevie')

หรืออาจมีประสิทธิภาพที่ดีขึ้นสำหรับอาร์เรย์ขนาดใหญ่:

myArray.findIndex(x => x.hello === 'stevie')

2
วิธีการที่ดีในการใช้ ES6
kag

ฉันรู้สึกประหลาดใจที่ไม่มีวิธีการใด ๆ เหล่านี้ที่มีประสิทธิภาพเท่ากับต้นแบบสำหรับลูปดังที่ได้กล่าวไว้ในคำตอบของฉัน แม้ว่าการสนับสนุนวิธีเบราว์เซอร์ findIndex ค่อนข้างแย่ แต่ดูเหมือนว่ามันจะทำแบบเดียวกัน แต่ก็ยังมีประสิทธิภาพน้อยลง? ดูลิงก์ในคำตอบของฉันสำหรับการวัดประสิทธิภาพ
Uniphonic

เป็นการดีที่จะรู้ว่าถ้าประสิทธิภาพเป็นสิ่งสำคัญสำหรับงานที่ทำอยู่ ในประสบการณ์ของฉันมันไม่ค่อยมาก แต่ ymmv
Steve Bennett


17

ฉันชอบคำตอบของ Pablo แต่แผนที่ Array # indexOf และ Array # ไม่ทำงานบนเบราว์เซอร์ทั้งหมด ขีดเส้นใต้จะใช้รหัสเนทิฟหากมี แต่มีข้อผิดพลาดเช่นกัน นอกจากนี้ยังมีวิธีการถอนเพื่อทำสิ่งที่แผนที่แบบไม่ระบุชื่อของ Pablo ทำ

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();

1
Array.prototype.map () มีการแยกสำหรับ IE9 + และคุณสามารถใช้ Polyfill สำหรับ IE8, 7, 6: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ …
Johann Echavarria

1
คุณสามารถใช้ polyfill ได้ . . หรือคุณก็สามารถใช้ขีดหรือ lodash ที่มีพื้น polyfills ที่มีทั้งกลุ่มของสินค้าอื่น ๆ ที่แนบมา การคัดค้านกับขีดล่างคืออะไร? ขนาด?
tandrewnichols

ฉันชอบ Underscore จริงๆคำตอบของคุณก็ฉลาดเช่นกัน แต่คำตอบของ IMHO Pablo นั้นสะอาดที่สุด
โยฮันน์ Echavarria

ว้าวฉันไม่เคยคิดที่จะใช้การผูกมัดแบบนั้น ฉันชอบวิธีที่ทำให้การค้นหาคล่องแคล่ว
Dylan Pierce

chainฟุ่มเฟือยที่นี่ _.pluck(myArray, 'hello').indexOf('stevie')
Steve Bennett

14

หรือต้นแบบมัน:

Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArr.indexOfObject("name", "stevie");

9
สะดวกมาก! แม้ว่าฉันจะเลือก prototype.indexOfObject เพื่อไม่ให้ยุ่งกับ exisitng วิธี Array.indexOf Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
อดัม

1
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);ฉันจะห่อไว้ในการปิดการดำเนินการด้วยตนเองกับความเป็นอยู่เก่าเก็บไว้ก่อนกับบรรทัดแรกของการเป็นสิ่งที่ฟังก์ชั่นการเปลี่ยนตามสายของ นี่เป็นเพราะสิ่งเหล่านี้เป็นประเภทที่ไม่เปลี่ยนรูป ฉันยังจะมีข้อโต้แย้งที่สามเพื่อเปิดใช้งานทางเลือกวิธีพื้นเมืองถ้าจำเป็น
Isiah Meadows

8

สั้น

myArray.indexOf('stevie','hello')

ใช้กรณี:

  /*****NORMAL****/  
[2,4,5].indexOf(4) ;//OUTPUT 1
 /****COMPLEX*****/
 [{slm:2},{slm:4},{slm:5}].indexOf(4,'slm');//OUTPUT 1
 //OR
 [{slm:2},{slm:4},{slm:5}].indexOf(4,function(e,i){
   return e.slm;
});//OUTPUT 1
/***MORE Complex**/
[{slm:{salat:2}},{slm:{salat:4}},{slm:{salat:5}}].indexOf(4,function(e,i){
   return e.slm.salat;
});//OUTPUT 1

API:

    Array.prototype.indexOfOld=Array.prototype.indexOf

    Array.prototype.indexOf=function(e,fn){
      if(!fn){return this.indexOfOld(e)}
      else{ 
       if(typeof fn ==='string'){var att=fn;fn=function(e){return e[att];}}
        return this.map(fn).indexOfOld(e);
      }
    };

6

ฉันทำการทดสอบประสิทธิภาพของคำตอบต่าง ๆ ที่นี่ซึ่งทุกคนสามารถดำเนินการด้วยตนเองได้:

https://jsperf.com/find-index-of-object-in-array-by-contents

จากการทดสอบครั้งแรกของฉันใน Chrome วิธีต่อไปนี้ (ใช้สำหรับลูปตั้งค่าภายในต้นแบบ) เป็นวิธีที่เร็วที่สุด:

Array.prototype.indexOfObject = function (property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArray.indexOfObject("hello", "stevie");

รหัสนี้เป็นคำตอบของ Nathan Zaetta รุ่นที่แก้ไขเล็กน้อย

ในการวัดประสิทธิภาพฉันลองใช้ทั้งกับเป้าหมายที่อยู่ตรงกลาง (ดัชนี 500) และจุดสิ้นสุด (ดัชนี 999) ของอาร์เรย์วัตถุ 1,000 รายการและแม้ว่าฉันจะวางเป้าหมายเป็นรายการสุดท้ายในอาร์เรย์ (ความหมาย มันจะต้องวนซ้ำทุกรายการในอาเรย์ก่อนที่จะพบมัน) มันยังคงเร็วที่สุด

โซลูชันนี้ยังมีประโยชน์ในการเป็นหนึ่งในบทสรุปที่มากที่สุดสำหรับการดำเนินการซ้ำ ๆ เนื่องจากเฉพาะบรรทัดสุดท้ายที่ต้องทำซ้ำ:

myArray.indexOfObject("hello", "stevie");

2
ฉันเพิ่งจะโพสต์คำตอบสำหรับคำถามนี้โดยใช้ซอกับการทดสอบของฉันเอง แต่ด้วยคำตอบของคุณฉันไม่ต้องทำอีกต่อไป ผมแค่อยากจะยืนยันการทดสอบของคุณ - ผมได้ผลเหมือนกัน แต่ใช้whileห่วงแทนหนึ่งและfor performance.now()ฉันหวังว่าคำตอบนี้จะได้รับการสนับสนุนมากขึ้นและฉันเห็นมันก่อนหน้านี้มันจะช่วยฉันได้สักพัก ...
Yin Cognyto

5

ฉันเปรียบเทียบวิธีการหลายวิธีและได้รับผลลัพธ์ด้วยวิธีที่เร็วที่สุดในการแก้ปัญหานี้ มันเป็นforวง เร็วกว่าวิธีอื่น ๆ มากกว่า 5 เท่า

นี่คือหน้าทดสอบ: https://jsbench.me/9hjewv6a98


ที่ขาดหายไปfor-ofไม่มีห่วง?
Douglas Gaskell

5

ในขณะที่คำตอบอื่น ๆ ส่วนใหญ่ที่นี่ใช้ได้ บางครั้งมันเป็นการดีที่สุดที่จะสร้างฟังก์ชั่นง่ายๆสั้น ๆ ใกล้กับที่ที่คุณจะใช้

// indexOf wrapper for the list of objects
function indexOfbyKey(obj_list, key, value) {
    for (index in obj_list) {
        if (obj_list[index][key] === value) return index;
    }
    return -1;
}
// Find the string in the list (default -1)
var test1 = indexOfbyKey(object_list, 'name', 'Stevie');
var test2 = indexOfbyKey(object_list, 'last_name', 'some other name');

ขึ้นอยู่กับสิ่งที่สำคัญสำหรับคุณ มันอาจบันทึกบรรทัดของรหัสและฉลาดมากที่จะใช้หนึ่งซับหรือวางโซลูชันทั่วไปที่ไหนสักแห่งที่ครอบคลุมกรณีขอบต่าง ๆ แต่บางครั้งก็เป็นการดีกว่าที่จะพูดว่า: "ที่นี่ฉันทำแบบนี้" แทนที่จะปล่อยให้นักพัฒนาในอนาคตมีงานวิศวกรรมย้อนกลับเป็นพิเศษ โดยเฉพาะอย่างยิ่งถ้าคุณพิจารณาตัวเองว่า "มือใหม่" ในคำถามของคุณ


4
array.filter(function(item, indx, arr){ return(item.hello === 'stevie'); })[0];

ใจ [0] .

มันเหมาะที่จะใช้reduceเช่นเดียวกับในAntonio Lagunaคำตอบของ

ขอโทษสำหรับความกะทัดรัด ...


4

หากวัตถุของคุณเป็นวัตถุเดียวกับวัตถุที่คุณใช้ภายในอาเรย์คุณควรจะสามารถรับดัชนีของวัตถุในแบบเดียวกับที่คุณทำราวกับว่ามันเป็นสตริง

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var qazCLONE = { // new object instance and same structure
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [hello,qaz];

myArray.indexOf(qaz) // should return 1
myArray.indexOf(qazCLONE) // should return -1

นี่คือคำตอบที่ฉันกำลังมองหาเพราะมันไม่ชัดเจนสำหรับฉันถ้า IndexOf จับคู่กับค่าหรืออะไร ตอนนี้ฉันรู้แล้วว่าฉันสามารถใช้ IndexOf เพื่อค้นหาวัตถุของฉันและไม่ต้องกังวลหากมีวัตถุอื่นที่มีคุณสมบัติเหมือนกัน
MDave



3

หากคุณมีความสนใจเฉพาะลงในการหาตำแหน่งที่เห็น@ คำตอบของปาโบล

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

แต่ถ้าคุณกำลังมองไปข้างหน้าเพื่อหาองค์ประกอบ (เช่นหากคุณมีความคิดในการทำบางสิ่งบางอย่างเช่นนี้myArray[pos]) มีความเป็นหนึ่งบรรทัดมีประสิทธิภาพมากขึ้นfilterวิธีที่จะทำโดยใช้

element = myArray.filter((e) => e.hello === 'stevie')[0];

ดูผลลัพธ์ที่สมบูรณ์แบบ (~ + 42% ops / วินาที): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3



2

ฉันได้ทำฟังก์ชั่นทั่วไปเพื่อตรวจสอบด้านล่างเป็นรหัส & ใช้งานได้กับวัตถุใด ๆ

function indexOfExt(list, item) {
    var len = list.length;

    for (var i = 0; i < len; i++) {
        var keys = Object.keys(list[i]);
        var flg = true;
        for (var j = 0; j < keys.length; j++) {
            var value = list[i][keys[j]];
            if (item[keys[j]] !== value) {
                flg = false;
            }
        }
        if (flg == true) {
            return i;
        }
    }
    return -1;
}

var items = [{ "hello": 'world', "foo": 'bar' }];
var selectedItem = { "hello": 'world', "foo": 'bar' };
alert(items.indexOf(selectedItem));
alert(indexOfExt(items, selectedItem));

การแจ้งเตือนครั้งแรกจะส่งคืน -1 (หมายถึงไม่พบการจับคู่) และการแจ้งเตือนครั้งที่สองจะส่งคืน 0 (หมายถึงการจับคู่ที่ตรงกัน)


2

ใช้_.findIndexจากunderscore.js ไลบรารี่

นี่คือตัวอย่าง _.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1


หากแนะนำวิธีการจากห้องสมุดเพิ่มเติมคุณควรระบุว่ามาจากไหน
Craicerjack

@Steve Bennett ใช้ประโยชน์ได้ดีจากห้องสมุดตอนนี้มันอยู่ในบ้านพัก
zabusa

2

ใช้findIndexเมธอด ES6 โดยไม่มี lodash หรือไลบรารี่อื่นคุณสามารถเขียน:

function deepIndexOf(arr, obj) {
  return arr.findIndex(function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

สิ่งนี้จะเปรียบเทียบคุณสมบัติของวัตถุในทันที แต่จะไม่ถูกนำกลับไปใช้กับคุณสมบัติ

หากการใช้งานของคุณยังไม่ได้ให้บริการfindIndex(ส่วนใหญ่ยังไม่ได้) คุณสามารถเพิ่ม polyfill แบบอ่อนที่รองรับการค้นหานี้:

function deepIndexOf(arr, obj) {
  function findIndex = Array.prototype.findIndex || function (pred) {
    for (let i = 0; i < this.length; ++i) {
      if (pred.call(this, this[i], i)) {
        return i;
      }
    }

    return -1;
  }

  return findIndex.call(arr, function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

(จากคำตอบของฉันในล่อนี้ )


2

คุณสามารถใช้ฟังก์ชั่นแบบเนทีฟและใช้งานง่ายArray.prototype.findIndex()โดยทั่วไป:

เมธอด findIndex () ส่งคืนดัชนีในอาร์เรย์ถ้าองค์ประกอบในอาร์เรย์เป็นไปตามฟังก์ชันการทดสอบที่ให้ไว้ มิฉะนั้นจะถูกส่งกลับ -1

เพียงทราบว่ามันไม่ได้รับการสนับสนุนใน Internet Explorer, Opera และ Safari แต่คุณสามารถใช้ Polyfill ที่ให้ไว้ในลิงค์ด้านล่าง

ข้อมูลมากกว่านี้:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello, qaz);

var index = myArray.findIndex(function(element, index, array) {
  if (element.hello === 'stevie') {
    return true;
  }
});
alert('stevie is at index: ' + index);


2

อีกต่อไปของ@Monika Garg ตอบคุณสามารถใช้findIndex()(มีpolyfillเบราว์เซอร์ unsupprted)

ฉันเห็นว่าผู้คนลงคะแนนให้กับคำตอบนี้และฉันหวังว่าพวกเขาจะทำเช่นนี้เพราะไวยากรณ์ผิดเพราะในความเห็นของฉันนี่เป็นวิธีที่ดีที่สุด

เมธอด findIndex () ส่งคืนดัชนีในอาร์เรย์ถ้าองค์ประกอบในอาร์เรย์เป็นไปตามฟังก์ชันการทดสอบที่ให้ไว้ มิฉะนั้นจะถูกส่งกลับ -1

ตัวอย่างเช่น:

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

var index = myArray.findIndex(function(element) {
  return element.hello == 'stevie';
});

alert(index);


วิธีนี้ดูดี แต่ไม่มี IE รองรับ MDN? developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Jaakko Karhu

ลองใช้ polyfill (ลิงก์ในคำตอบ)
Mosh Feu

1

นี่คือวิธีการค้นหาดัชนีของวัตถุในอาร์เรย์

    var myArray = [{  hello: 'world',
        foo: 'bar'
    },{
        hello: 'stevie',
        foo: 'baz'
    }];



    for (i = 0; i < myArray.length; i++) {
        if (myArray[i].hello === 'stevie') {
            alert('position: ' + i);
            return;
        }
    }

0

ใช้งานได้โดยไม่มีรหัสที่กำหนดเอง

var arr, a, found;
arr = [{x: 1, y: 2}];
a = {x: 1, y: 2};
found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1;
// found === true

หมายเหตุ:สิ่งนี้ไม่ได้ให้ดัชนีจริงมันจะบอกเฉพาะถ้าวัตถุของคุณมีอยู่ในโครงสร้างข้อมูลปัจจุบัน


1
สิ่งนี้ไม่ถูกต้องเนื่องจากไม่อนุญาตให้รับดัชนีใด ๆ
Antonio Laguna

0

คุณสามารถใช้

const someId = 2;
const array = [{id:1}, {id:2}, {id:3}];
const index = array.reduce((i, item, index) => item.id === someId ? index : i, -1);
alert('someId ' + someId + ' is at index ' + index);

ไม่ขีดเส้นใต้ไม่มีสำหรับการลดลง


0
var hello = {hello: "world",  foo: "bar"};
var qaz = {hello: "stevie", foo: "baz"};
var myArray = [];
myArray.push(hello,qaz);

function indexOfObject( arr, key, value   ) {
    var j = -1;
    var result = arr.some(function(obj, i) { 
        j++;
        return obj[key] == value;
    })

    if (!result) {
        return -1;
    } else {
        return j;
    };
}

alert(indexOfObject(myArray,"hello","world"));

ใช้ Array ได้บ้าง
user3235365

-1

คุณสามารถสร้างต้นแบบของคุณเองเพื่อทำสิ่งนี้:

สิ่งที่ต้องการ:

Array.prototype.indexOfObject = function (object) {
    for (var i = 0; i < this.length; i++) {
        if (JSON.stringify(this[i]) === JSON.stringify(object))
            return i;
    }
}

2
การฝึกฝนที่ไม่ดีการทำลาย encapsulation: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
HMR

สิ่งนี้จะทำลายวัตถุที่กำหนดซ้ำ
Joseph Coco

-2

ฉันต้องการใช้findIndex()วิธี:

 var index = myArray.findIndex('hello','stevie');

index จะให้หมายเลขดัชนีแก่คุณ


1
คำตอบการสะกดและการเยื้องรหัสและ :) ผิดหรือเปล่า?
Sachin Verma

1
findIndex ไม่ได้อยู่ในการใช้มาตรฐานจาวาสคริปต์ มีข้อเสนอที่กำลังจะเกิดขึ้น (ecma 6) สำหรับวิธีการดังกล่าว แต่ลายเซ็นของมันไม่เป็นเช่นนั้น โปรดอธิบายสิ่งที่คุณหมายถึง (อาจเป็นชื่อของวิธีการ) ให้การประกาศเมธอด findIndex หรือตั้งชื่อไลบรารีที่คุณใช้
Sebastien F.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.