我有一个这样的数组:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

我怎么能得到对象的索引,匹配的条件,而不是在整个数组上迭代?

例如,给定prop2=="yutu",我想获得索引1。

我看到过. indexof(),但认为它用于简单的数组,如["a1","a2",…]。我还检查了$.grep(),但这返回对象,而不是索引。


当前回答

使用Array.reduce()的一个步骤-没有jQuery

var items = [{id: 331}, {id: 220}, {id: 872}];

var searchIndexForId = 220;
var index = items.reduce(function(searchIndex, item, index){
  if(item.id === searchIndexForId) { 
    console.log('found!');
    searchIndex = index;
  }
  return searchIndex;
}, null);

如果没有找到索引,将返回null。

其他回答

另一种简单的方法是:

 function getIndex(items) {
        for (const [index, item] of items.entries()) {
            if (item.prop2 === 'yutu') {
                return index;
            }
        }
    }

const myIndex = getIndex(myArray);
var index;
yourArray.some(function (elem, i) {
    return elem.prop2 === 'yutu' ? (index = i, true) : false;
});

遍历数组的所有元素。 它返回索引,如果条件不匹配则返回true或false。

重要的是显式返回值为true(或布尔结果为true的值)。单个赋值是不够的,因为索引可能为0 (Boolean(0) === false),这不会导致错误,但会禁用中断迭代。

Edit

上面的一个更简短的版本:

yourArray.some(function (elem, i) {
    return elem.prop2 === 'yutu' && ~(index = i);
});

为什么不进行迭代呢?新的Array.prototype.forEach非常适合这个目的!

如果需要,可以使用二叉搜索树通过单个方法调用进行查找。这是一个整洁的实现的BTree和红黑搜索树在JS - https://github.com/vadimg/js_bintrees -但我不确定你是否能同时找到索引。

从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');

与大多数优化一样,这应该在实际需要时谨慎应用。

最好和最快的方法是:

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