多维对象数组的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
在这种情况下必须有四个元素,而不是两个。每个键一次。不过,这个想法很好。我假设这只是虚假数据,所以我认为一个简单的示例就足够了。注意,它返回-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'));