我有一个这样的数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
我怎么能得到对象的索引,匹配的条件,而不是在整个数组上迭代?
例如,给定prop2=="yutu",我想获得索引1。
我看到过. indexof(),但认为它用于简单的数组,如["a1","a2",…]。我还检查了$.grep(),但这返回对象,而不是索引。
我有一个这样的数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
我怎么能得到对象的索引,匹配的条件,而不是在整个数组上迭代?
例如,给定prop2=="yutu",我想获得索引1。
我看到过. indexof(),但认为它用于简单的数组,如["a1","a2",…]。我还检查了$.grep(),但这返回对象,而不是索引。
当前回答
最好和最快的方法是:
const products = [
{ prop1: 'telephone', prop2: 996 },
{ prop1: 'computadora', prop2: 1999 },
{ prop1: 'bicicleta', prop2: 995 },
];
const index = products.findIndex(el => el.prop2 > 1000);
console.log(index); // 1
其他回答
Georg已经提到了ES6有数组。查找索引。 其他一些答案是ES5使用Array的变通方法。一些方法。
一种更优雅的方法是
var index;
for(index = yourArray.length; index-- > 0 && yourArray[index].prop2 !== "yutu";);
同时,我想强调一下,阵列。有些可以用二进制或其他有效的搜索技术实现。因此,在某些浏览器中,它可能在for循环中执行得更好。
var CarId = 23;
//x.VehicleId property to match in the object array
var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId);
对于基本数组号,你也可以这样做:
var numberList = [100,200,300,400,500];
var index = numberList.indexOf(200); // 1
如果它在数组中找不到值,就会得到-1。
TJ Crowder说,每一种方式都会有某种隐藏的迭代,使用lodash这就变成:
var index = _.findIndex(array, {prop2: 'yutu'})
从2016年开始,你应该使用Array。findIndex (ES2015/ES6标准)用于:
a = [ {prop1 " abc " prop2 qwe "} ", {prop1 bnmb "、" prop2 yutu "}, " {prop1 zxvz "、" prop2 qwrq "} "]; index = a.f ndindex (x => x.p rp2 ==="yutu"); console.log (index);
支持谷歌Chrome, Firefox和Edge。对于ie浏览器,在链接页面上有一个填充。
性能报告
函数调用是非常昂贵的,因此对于非常大的数组,一个简单的循环将比findIndex执行得更好:
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');
与大多数优化一样,这应该在实际需要时谨慎应用。
另一种简单的方法是:
function getIndex(items) {
for (const [index, item] of items.entries()) {
if (item.prop2 === 'yutu') {
return index;
}
}
}
const myIndex = getIndex(myArray);