我想问一个关于JavaScript中的2D数组的问题,类似于:
var array = [[2,45],[3,56],[5,67],[8,98],[6,89],[9,89],[5,67]]
也就是说,在每个索引上,我也有一个数组。
假设我的第二个索引中有一个值,如56
,我想要相应的第一个索引(例如上面的3个索引)。
我可以使用循环(如果没有其他选项),但还有更好的方法吗?
另外,我在JavaScript中知道indexOf
方法,但是当我这样调用它时它没有返回索引:
array.indexOf(56);
任何见解都会有所帮助。
答案 0 :(得分:11)
使用一些迭代器函数。
filter
允许您迭代数组,并在函数返回true
时仅返回值。
现代浏览器方式:
var arr = array.filter( function( el ) {
return !!~el.indexOf( 56 );
} );
console.log( arr ); // [3, 56]
console.log( arr[ 0 ] ); // "3"
传统浏览器方式,使用jQuery:
var arr = $.filter( array, function() {
return !!~$.inArray( 56, $( this ) );
} );
console.log( arr ); // [3, 56]
console.log( arr[ 0 ] ); // "3"
答案 1 :(得分:6)
你可以这样做:
var ret;
var index = array.map(function(el){return el[1];}).indexOf(56);
if (index !== -1) {
ret = array[index][0];
}
答案 2 :(得分:1)
我发现在IE6中至少(我不确定更新的版本),内置的Array类型没有indexOf方法。如果您在IE中进行测试,也许这就是您无法入门的原因。我在我的所有代码中写了这个小小的附加内容:
if(!Array.prototype.indexOf){
Array.prototype.indexOf = function(obj){
for(var i=0; i<this.length; i++){
if(this[i]===obj){
return i;
}
}
return -1;
};
}
我真的不能相信这一点。它可能是我在一些教程或Doug Crockford的文章中发现的相当通用的代码片段。我很确定会有更好的写作方式。
我发现在Firefox中工作是一个很好的起点,因为您可以安装Firebug控制台并更好地了解出现问题的地方。我承认这并不能解决跨浏览器问题,但至少它可以帮助您开始项目。
这段代码将确保您可以使用indexOf方法查找给定值在一维数组中的位置。使用二维数组,外部数组中的每个元素都是一个数组,而不是单个值。我会做一些测试,看看它是如何工作的并回到你身边,除非别人有更好的答案。
我希望这至少可以让你开始。
UPDATE 假设您有一个实现Array.indexOf的浏览器,我已经尝试了每种方法来传递外部数组中的一个数组元素。
alert(array.indexOf([3,56]))
alert(array.indexOf("3,56"))
只返回-1。
奇怪的是,
alert(array.indexOf(array[1]))
正确返回1.但是你需要知道内部数组的索引来获取索引!我看不到将数组传递给indexOf方法的方法。
答案 3 :(得分:0)
array.indexOf( x )
返回数组中x
的位置,如果未找到,则返回-1。在你的2D数组中,这是没用的,因为56不在数组中;它位于array
中包含的数组中。
您必须遍历第一个数组,然后使用indexOf
检查每个子数组。