amp*_*amp 271 javascript arrays jquery
我有这样一个数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Run Code Online (Sandbox Code Playgroud)
如何在不迭代整个数组的情况下获取与条件匹配的对象的索引?
例如,给定prop2=="yutu",我想获得索引1.
我看到.indexOf()但是认为它用于简单的数组["a1","a2",...].我也检查了$.grep()但这会返回对象,而不是索引.
geo*_*org 606
截至2016年,您应该使用Array.findIndex(ES2015/ES6标准):
a = [
{prop1:"abc",prop2:"qwe"},
{prop1:"bnmb",prop2:"yutu"},
{prop1:"zxvz",prop2:"qwrq"}];
index = a.findIndex(x => x.prop2 ==="yutu");
console.log(index);Run Code Online (Sandbox Code Playgroud)
谷歌Chrome,Firefox和Edge支持它.对于Internet Explorer,链接页面上有一个polyfill.
老答案:
使用jQuery:
let test = [];
for (let i = 0; i < 1e6; i++)
test.push({prop: i});
let search = test.length - 1;
let count = 100;
console.time('findIndex/predefined function');
let fn = obj => obj.prop === search;
for (let i = 0; i < count; i++)
test.findIndex(fn);
console.timeEnd('findIndex/predefined function');
console.time('findIndex/dynamic function');
for (let i = 0; i < count; i++)
test.findIndex(obj => obj.prop === search);
console.timeEnd('findIndex/dynamic function');
console.time('loop');
for (let i = 0; i < count; i++) {
for (let index = 0; index < test.length; index++) {
if (test[index].prop === search) {
break;
}
}
}
console.timeEnd('loop');Run Code Online (Sandbox Code Playgroud)
没有jQuery,稍微复杂一点:
a = [
{prop1:"abc",prop2:"qwe"},
{prop1:"bnmb",prop2:"yutu"},
{prop1:"zxvz",prop2:"qwrq"}];
index = a.findIndex(x => x.prop2 ==="yutu");
console.log(index);Run Code Online (Sandbox Code Playgroud)
T.J*_*der 26
如何获得与条件匹配的对象索引(不沿数组迭代)?
你不能,什么都有通过数组(至少一次)进行迭代.
如果条件变化很大,那么你将不得不循环并查看其中的对象以查看它们是否与条件匹配.但是,在具有ES5功能的系统上(或者如果安装了垫片),可以相当简洁地完成该迭代:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
它使用new(ish)Array#some函数,它循环遍历数组中的条目,直到你给它的函数返回true.我给它的函数保存了匹配条目的索引,然后返回true以停止迭代.
或者当然,只需使用for循环.您可以在其他答案中介绍各种迭代选项.
但是如果你总是要为这个查找使用相同的属性,并且如果属性值是唯一的,你可以只循环一次并创建一个对象来映射它们:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
Run Code Online (Sandbox Code Playgroud)
(或者,您可以再次使用for循环或任何其他选项.)
然后,如果您需要找到条目prop2 = "yutu",您可以这样做:
var entry = prop2map["yutu"];
Run Code Online (Sandbox Code Playgroud)
我把这称为"交叉索引"数组.当然,如果删除或添加条目(或更改其prop2值),则还需要更新映射对象.
ali*_*iak 21
什么TJ克劳德说,无论如何都会有某种隐藏的迭代,随着lodash变成:
var index = _.findIndex(array, {prop2: 'yutu'})
Run Code Online (Sandbox Code Playgroud)
Dav*_*tro 12
var CarId = 23;
//x.VehicleId property to match in the object array
var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId);
Run Code Online (Sandbox Code Playgroud)
Ger*_*man 12
使用Array.map()和Array.indexOf(string)
const arr = [{
prop1: "abc",
prop2: "qwe"
}, {
prop1: "bnmb",
prop2: "yutu"
}, {
prop1: "zxvz",
prop2: "qwrq"
}]
const index = arr.map(i => i.prop2).indexOf("yutu");
console.log(index);Run Code Online (Sandbox Code Playgroud)
Nin*_*olz 11
var index;
yourArray.some(function (elem, i) {
return elem.prop2 === 'yutu' ? (index = i, true) : false;
});
Run Code Online (Sandbox Code Playgroud)
迭代数组的所有元素.如果条件不匹配,它返回索引和true或false.
重要的是显式返回值true(或布尔结果为true的值).单个赋值是不够的,因为可能的索引为0(布尔值(0)=== false),这不会导致错误但会禁用迭代的中断.
编辑
以上更简短的版本:
yourArray.some(function (elem, i) {
return elem.prop2 === 'yutu' && ~(index = i);
});
Run Code Online (Sandbox Code Playgroud)
小智 5
我在上面看到了很多解决方案。
这里我使用map函数来查找数组对象中搜索文本的索引。
我将使用学生数据来解释我的答案。
步骤 1:为学生创建数组对象(可选,您可以创建自己的数组对象)。
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
步骤 2:创建变量来搜索文本
var studentNameToSearch = "Divya";
步骤3:创建变量来存储匹配的索引(这里我们使用map函数来迭代)。
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
var studentNameToSearch = "Divya";
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
console.log(matchedIndex);
alert("Your search name index in array is:"+matchedIndex)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
339517 次 |
| 最近记录: |