2

我有一个对象数组示例:

var myVar = new Array();
    myVar.push({'abc':'123','def':'456'});
    myVar.push({'ghi':'789','jkl':'012'});

我想通过属性/值找到给定对象的数组级别的 indexOf 。

alert(myVar.indexOf('ghi'));

似乎不是找到它的行动路线,我想我明白为什么,但是弄清楚如何获取具有属性的对象的数组的索引ghi让我很难过,并为想法敞开心扉。

4

5 回答 5

4
var findIndex=function(key,arr) {
    for(var i=0, j=arr.length; i<j; i++) {
        if(arr[i].hasOwnProperty(key)) {
            return i;
        }
    }
    return -1;
};
var index=findIndex('ghi',myVar);

编辑 Jan 提出了一个重要的观点:记住期望整数不低于0成功查找的整数,即使0计算结果为,false因为它是一个有效的索引。-1表示未找到您的密钥。

于 2013-05-21T02:38:26.440 回答
2

Working FIDDLE Demo

为它写一个函数,像这样:

function findIndex(arr, key) {
    for (var i = 0, l = arr.length; i < l; i++) {
        if (arr[i].hasOwnProperty(key)) {
            return i;
        }
    }

    return -1;
}

结果:

findIndex(myVar, 'ghi');
// 1

findIndex(myVar, 'def');
// 0

-1如果没有找到,它将返回:

findIndex(myVar, 'non');
// -1
于 2013-05-21T02:39:17.093 回答
2
Array.prototype.findIndexOf = function(prop) {
    var i = -1;
    this.forEach(function(elem, index) {
        if (prop in elem) {
            i = index;
            return false;
        }
    })
    return i;
}

console.log(myVar.findIndexOf('property'));

http://jsfiddle.net/ZUHPF/

于 2013-05-21T02:44:39.787 回答
0

您必须遍历数组。 .indexOf以任何方式切割它都行不通。

myVar.forEach(function (elem, idx) {
    if (elem.hasOwnProperty('ghi')) {
        console.log(idx);
    }
});

http://jsfiddle.net/ExplosionPIlls/uaPVP/

可能可以使用更好的方法,具体取决于您要对索引做什么,但这至少应该给您一个想法。

于 2013-05-21T02:39:07.310 回答
0

除了将对象存储在数组中之外,您还可以将它们放在父对象中,其中每个对象都是父对象的属性。这将允许您像您尝试做的那样通过键获取对象。

var myObject = {
    abc: {'abc':'123','def':'456'},
    ghi: {'ghi':'789','jkl':'012'}
}

现在您可以通过键访问对象,而不是遍历数组中的每个项目:

var objectByKey = myObject['ghi']; // grab object by property name like this
于 2013-05-21T02:40:10.520 回答