如何获取数组中对象的索引,匹配条件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我有这样一个数组:

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

如何获得对象的索引与条件匹配(不沿数组迭代)?

例如:对于prop2=="yutu",我想要索引1

我看到了.indexOf()方法,但认为它用于以下简单数组:["a1","a2",...]我也查过$.grep()但这会返回我的对象而不是索引..。

提问于
用户回答回答于

你应该用Array.findIndex(ES 2015/ES6标准):

a = [
  {prop1:"abc",prop2:"qwe"},
  {prop1:"bnmb",prop2:"yutu"},
  {prop1:"zxvz",prop2:"qwrq"}];
    
index = a.findIndex(x => x.prop2=="yutu");

console.log(index);

在GC、FF和Edge中都支持它,对于MSIE,链接页面上有一个多填充。

旧答案:

使用jQuery:

indexes = $.map(list, function(obj, index) {
    if(obj.prop2 == "yutu") {
        return index;
    }
})

firstIndex = indexes[0]

如果没有jQuery,则会稍微复杂一些:

indexes = list.map(function(obj, index) {
    if(obj.prop2 == "yutu") {
        return index;
    }
}).filter(isFinite)
用户回答回答于

我怎样才能得到符合条件的对象的索引(不沿数组迭代)?

你不能,有些东西需要遍历数组(至少一次)。

如果条件变化很大,那么你必须循环查看其中的对象,以查看它们是否符合条件。但是,在具有ES5功能的系统上,该迭代可以非常简洁地完成:

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;
});

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

var entry = prop2map["yutu"];

我称之为“交叉索引”阵列。自然,如果你删除或添加条目(或更改其prop2值),则还需要更新映射对象。

扫码关注云+社区