ในขีดล่างฉันสามารถค้นหารายการที่มีค่าคีย์เฉพาะได้สำเร็จ
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
แต่ฉันจะหาดัชนีอาร์เรย์ที่ออบเจ็กต์เกิดขึ้นได้อย่างไร
ในขีดล่างฉันสามารถค้นหารายการที่มีค่าคีย์เฉพาะได้สำเร็จ
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
แต่ฉันจะหาดัชนีอาร์เรย์ที่ออบเจ็กต์เกิดขึ้นได้อย่างไร
findIndex:var dataIndex = _.findIndex(tv, { id: voteID })
คำตอบ:
ฉันไม่ทราบว่ามีวิธีการขีดล่างที่ทำสิ่งนี้ได้หรือไม่ แต่คุณสามารถบรรลุผลลัพธ์เดียวกันได้ด้วยจาวาสคริปต์ธรรมดา
Array.prototype.getIndexBy = function (name, value) {
for (var i = 0; i < this.length; i++) {
if (this[i][name] == value) {
return i;
}
}
return -1;
}
จากนั้นคุณสามารถทำได้:
var data = tv[tv.getIndexBy("id", 2)]
return -1;ค่าเริ่มต้น?
findIndex ถูกเพิ่มใน 1.8:
index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })
ดู: http://underscorejs.org/#findIndex
อีกวิธีหนึ่งก็ใช้ได้เช่นกันหากคุณไม่คิดจะสร้างรายการชั่วคราวอื่น:
index = _.indexOf(_.pluck(tv, 'id'), voteId);
index = _.findIndex(tv, {id: voteID})งานได้และยังใช้งานได้หากtvคอลเล็กชันมีค่าที่ซับซ้อนมากขึ้น (มากกว่าidคุณสมบัติ)
หากคุณต้องการอยู่กับขีดล่างเพื่อให้ฟังก์ชันเพรดิเคตของคุณมีความยืดหยุ่นมากขึ้นนี่คือ 2 แนวคิด
ตั้งแต่เพรดิเคตสำหรับ _.findรับทั้งค่าและดัชนีขององค์ประกอบคุณสามารถใช้ผลข้างเคียงเพื่อดึงดัชนีได้ดังนี้:
var idx;
_.find(tv, function(voteItem, voteIdx){
if(voteItem.id == voteID){ idx = voteIdx; return true;};
});
ดูที่แหล่งที่มาขีดล่างนี่คือวิธี_.findการใช้งาน:
_.find = _.detect = function(obj, predicate, context) {
var result;
any(obj, function(value, index, list) {
if (predicate.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
ในการทำให้findIndexฟังก์ชันนี้เป็นเพียงแค่แทนที่บรรทัดresult = value;ด้วยresult = index;นี่เป็นแนวคิดเดียวกับวิธีแรก ฉันรวมไว้เพื่อชี้ให้เห็นว่าขีดล่างใช้ผลข้างเคียงในการนำไปใช้_.findเช่นกัน
หากสภาพแวดล้อมเป้าหมายของคุณรองรับ ES2015 (หรือคุณมีขั้นตอน Transpile เช่นกับ Babel) คุณสามารถใช้ Array.prototype.findIndex () ดั้งเดิมได้
ให้ตัวอย่างของคุณ
const array = [ {id:1}, {id:2} ]
const desiredId = 2;
const index = array.findIndex(obj => obj.id === desiredId);
คุณสามารถใช้indexOfวิธีจากlodash
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
var index=_.indexOf(tv,data);
ให้มันง่าย:
// Find the index of the first element in array
// meeting specified condition.
//
var findIndex = function(arr, cond) {
var i, x;
for (i in arr) {
x = arr[i];
if (cond(x)) return parseInt(i);
}
};
var idIsTwo = function(x) { return x.id == 2 }
var tv = [ {id: 1}, {id: 2} ]
var i = findIndex(tv, idIsTwo) // 1
หรือสำหรับผู้ที่ไม่เกลียดชังตัวแปร CoffeeScript:
findIndex = (arr, cond) ->
for i, x of arr
return parseInt(i) if cond(x)
return parseInt(i) for i, x of array when cond(x)
นี่คือการช่วยเหลือlodashผู้ใช้ ตรวจสอบว่ามีกุญแจของคุณอยู่หรือไม่โดยทำ:
hideSelectedCompany(yourKey) {
return _.findIndex(yourArray, n => n === yourKey) === -1;
}
วิธีแก้ปัญหาที่ง่ายที่สุดคือการใช้ lodash:
npm install - บันทึก lodash
const _ = ต้องใช้ ('lodash');
findIndexByElementKeyValue = (elementKeyValue) => {
return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue);
}
หากคุณคาดหวังการแข่งขันหลายรายการและด้วยเหตุนี้จึงต้องส่งคืนอาร์เรย์ให้ลอง
_.where(Users, {age: 24})
หากค่าคุณสมบัติไม่ซ้ำกันและคุณต้องการดัชนีของการจับคู่ให้ลอง:
_.findWhere(Users, {_id: 10})
Array.prototype.getIndex = function (obj) {
for (var i = 0; i < this.length; i++) {
if (this[i][Id] == obj.Id) {
return i;
}
}
return -1;
}
List.getIndex(obj);
ฉันมีกรณีที่คล้ายกัน แต่ในทางตรงกันข้ามคือการค้นหาคีย์ที่ใช้ตามดัชนีของวัตถุที่กำหนด ฉันสามารถหาวิธีแก้ปัญหาในขีดล่างโดยใช้Object.valuesเพื่อส่งคืนวัตถุในอาร์เรย์เพื่อรับดัชนีที่เกิดขึ้น
var tv = {id1:1,id2:2};
var voteIndex = 1;
console.log(_.findKey(tv, function(item) {
return _.indexOf(Object.values(tv), item) == voteIndex;
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>