我有一个这样的数组:

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

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

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

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


当前回答

var list =  [
                {prop1:"abc",prop2:"qwe"},
                {prop1:"bnmb",prop2:"yutu"},
                {prop1:"zxvz",prop2:"qwrq"}
            ];

var findProp = p => {
    var index = -1;
    $.each(list, (i, o) => {
        if(o.prop2 == p) {
            index = i;
            return false; // break
        }
    });
    return index; // -1 == not found, else == index
}

其他回答

使用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。

最好和最快的方法是:

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

我怎么能得到对象的索引匹配的条件(没有迭代沿数组)?

你不能,某些东西必须遍历数组(至少一次)。

如果条件变化很大,则必须遍历并查看其中的对象,以确定它们是否与条件匹配。然而,在一个带有ES5特性的系统上(或者如果你安装了一个shim),这个迭代可以相当简单地完成:

var index;
yourArray.some(function(entry, i) {
    if (entry.prop2 == "yutu") {
        index = i;
        return true;
    }
});

它使用了新的(ish) array# some函数,该函数循环遍历数组中的条目,直到您赋予它的函数返回true。我给它的函数保存匹配条目的索引,然后返回true以停止迭代。

当然,也可以使用for循环。您的各种迭代选项都包含在另一个答案中。

但如果你总是要使用相同的属性进行查找,如果属性值是唯一的,你可以只循环一次,并创建一个对象来映射它们:

var prop2map = {};
yourArray.forEach(function(entry) {
    prop2map[entry.prop2] = entry;
});

(或者,同样,您可以使用for循环或任何其他选项。)

然后如果你需要找到prop2 = "yutu"的条目,你可以这样做:

var entry = prop2map["yutu"];

我称之为“交叉索引”数组。当然,如果您删除或添加条目(或更改它们的prop2值),您也需要更新映射对象。

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。

var list =  [
                {prop1:"abc",prop2:"qwe"},
                {prop1:"bnmb",prop2:"yutu"},
                {prop1:"zxvz",prop2:"qwrq"}
            ];

var findProp = p => {
    var index = -1;
    $.each(list, (i, o) => {
        if(o.prop2 == p) {
            index = i;
            return false; // break
        }
    });
    return index; // -1 == not found, else == index
}