多维对象数组的javascript索引

多维对象数组的javascript索引,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个对象数组示例: var myVar = new Array(); myVar.push({'abc':'123','def':'456'}); myVar.push({'ghi':'789','jkl':'012'}); 我想通过属性/值查找给定对象的数组级别的indexOf alert(myVar.indexOf('ghi')); 似乎并不是找到它的行动路线,我想我理解为什么,但弄清楚如何获得具有ghi属性的对象数组的索引让我感到困惑,并为idea打开了大门。var

我有一个对象数组示例:

var myVar = new Array();
    myVar.push({'abc':'123','def':'456'});
    myVar.push({'ghi':'789','jkl':'012'});
我想通过属性/值查找给定对象的数组级别的indexOf

alert(myVar.indexOf('ghi'));
似乎并不是找到它的行动路线,我想我理解为什么,但弄清楚如何获得具有
ghi
属性的对象数组的索引让我感到困惑,并为idea打开了大门。

var findIndex=function(key,arr){
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);

对于(var i=0,j=arr.length;i您必须迭代数组。
.indexOf
无法以任何方式对其进行切片

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

根据您对索引的具体操作,可能会使用更好的方法,但这至少会给您一个想法。

为它编写一个函数,如下所示:

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

    return -1;
}
如果未找到任何内容,它将返回
-1

findIndex(myVar, 'non');
// -1

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

var myObject = {
    abc: {'abc':'123','def':'456'},
    ghi: {'ghi':'789','jkl':'012'}
}
现在,您可以通过键访问对象,而不是在数组中的每个项目上循环:

var objectByKey = myObject['ghi']; // grab object by property name like this


数组的元素是对象,而不是字符串,因此在数组中永远找不到字符串。不要使用
new array()
。使用
[]
。在您的情况下,甚至
[{…},{…}]
。数组是动态构建的。在最初使用
[]定义数组时,我发现使用myVar.push偶尔会出现问题
而随着时间的推移,添加到数组中的对象可能只是一个、两个或一百个,但它是在用户交互过程中完成的
不适用于整体原因。不幸的是,我是在现有系统的基础上构建的,因此,我必须使用我得到的,因为他们不会分配时间重写很多东西,所以坚持使用我得到的,并试图找到处理方法。这
如果(l)
在这里有点毫无意义。如果
l
为零,迭代条件将处理这个事实。@JanDvorak,我已经纠正了;)+1,而不是
j=i;break;
只要
返回i;
就可以了。然后根据Jan的评论删除外部if。灵感来自;-)@RobG是的,你是对的,我已经更改了;)因为他可能想进一步使用索引,函数式迭代可能是这里的负担。@JanDvorak为什么?这真的取决于具体情况(他是在寻找索引还是元素,以及单个元素还是可能多个元素)一旦找到属性,也应该停止搜索。这基本上是为具有该属性的每个元素运行代码。
myObject
在这种情况下必须有四个元素,而不是两个。每个键一次。不过,这个想法很好。我假设这只是虚假数据,所以我认为一个简单的示例就足够了。注意,它返回undefined。如果希望改为
-1
,只需在末尾添加一个显式返回语句。+1,但为什么要使用函数表达式而不是声明?只是我的样式:)我习惯于将函数编码为其他对象的属性。由于函数是JavaScript中的第一类对象,因此对我来说更有意义。
Array.prototype.index=
——我不建议扩展您不拥有的类。您可能会与其他开发人员、库、未来版本的ecmascript发生名称空间冲突……一个“我希望有人知道其他库、开发人员在做什么。不应该有这样的“如果”。@JanDvorak:恕我直言,了解自己的编码环境不应该被视为一种理论。在我看来,这应该是一种标准实践,也是第一要务。你关于未来添加ECMAScript的观点当然是正确的,但se的运行非常缓慢,数量很少,而且可以提前几年看到。@JanDvorak:这些都是公共库。这与项目代码的关注点非常不同。没有理由将这样一个库的关注点应用于所有情况。也就是说,我查看了最新的ES6草案,其中有一个
数组。prototype
extension提供了类似的功能,所以最好的方法是测试该方法,并添加它。这样代码就是未来的证明。15.4.3.24 Array.prototype.findIndex(谓词,thisArg=undefined)@JanDvorak:是的,我确实注意到……在我的评论中,;-)这样一个简单操作的语义似乎不太可能改变很多或根本不会改变,但这是一个值得关注的问题。可以用一个修改过的名称来实现,可能带有一个前导下划线,然后在规范最终确定后根据需要快速查找/替换。
var objectByKey = myObject['ghi']; // grab object by property name like this
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'));