获取数组内对象的索引,匹配条件

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)

  • 我喜欢使用polyfill的建议.然而,由于使用了箭头/ lambda函数,即使使用polyfill,所写的代码仍然在IE11中失败.重写为`index = a.findIndex(function(x){return x.prop2 =="yutu"})`修复问题,以便使用polyfill代码,findIndex在IE11中工作 (6认同)
  • 你能解释一下`x => x.prop2 =="yutu"`如何使用findIndex()? (4认同)
  • @AbhayPai:它与`function(x){return x.prop2 =="yutu"}相同 (4认同)
  • 我不认为这里需要一个临时阵列.只需使用迭代器函数关闭上下文并使用变量的事实.此外,非jQuery版本不起作用(假设它在索引'0`处找到?).*两个*解决方案都进行了比所需更多的迭代,如果数组很大,这是不太理想的(尽管人类会注意到它的可能性很小,除非查找发生了很多**). (3认同)

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)