Javascript 2d数组索引

Javascript 2d数组索引,javascript,arrays,2d,indexof,Javascript,Arrays,2d,Indexof,我有一个二维数组,如下所示: var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]]; 每个索引存储一个包含某个元素坐标的内部数组 如何使用检查新生成的坐标集是否已包含在arr中?如果坐标不是重复的,我想进入arr 以下是我的尝试,但没有成功: if (arr.indexOf([x, y]) == -1) { arr.push([x, y]); } 看起来indexOf()不适用于二维数组… for(var k=0;k

我有一个二维数组,如下所示:

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];
每个索引存储一个包含某个元素坐标的内部数组

如何使用检查新生成的坐标集是否已包含在
arr
中?如果坐标不是重复的,我想进入
arr

以下是我的尝试,但没有成功:

if (arr.indexOf([x, y]) == -1) {
    arr.push([x, y]);
}
看起来
indexOf()
不适用于二维数组…

for(var k=0;k

与简单的索引相比,这更像是一种黑客方法,但它可以工作

因为这是一个二维数组,所以需要一个嵌套的for循环

var newArr = [1, 2],
    counter;


for ( var i = 0; i < arr.length; i++ ) {

    for ( var x = 0; x = arr[i].length; x++ ) {

        if ( arr[i][x] === newArr[x] {

             counter++ 
        }

        if (counter === 2) {
            alert('new coord!')
        }
    }
    //reset counter
    counter = 0;
}
var newArr=[1,2],
柜台
对于(变量i=0;i
您不能使用indexOf来处理复杂的数组(除非您将其序列化,使每个坐标都成为字符串),您需要使用for循环(或while)在该数组中搜索该坐标,前提是您知道数组的格式(在本例中为2d)

var-arr=[[2,3]、[5,8]、[1,1]、[0,9]、[5,7];
var coor1=[0,9];
var coor2=[1,2];
函数isItemInArray(数组,项){
对于(var i=0;i
这个实现循环并获取每个值。如果你关心性能,你可以做更复杂的事情,比如按第一个索引对原始数组排序,然后对第一个索引使用二进制搜索

另一种方法是将数组中每个项目的第一个坐标存储在对象(如哈希表)中,并将第二个值存储在每个存储桶中,以减少搜索时间;更多信息请参见此处


否则,这可能足以满足您的需要。

之前的回答是:


您不能使用indexOf来处理复杂的数组(除非您将其序列化,使每个坐标都成为字符串)

下面是您如何做到这一点的。如果您有一个非常大的数据集,我建议您不要使用这种技术,因为它依赖于2D数组的副本。但是对于合理的数据集,它很简单

使用一致的方法展平阵列元素,例如:

// Flatten array into a string, separating elements with a "unique" separator.
function stringle( arr ) {
  return arr.join(' |-| ');
}
这对于您的示例来说太过分了,因为子数组包含整数,但它可以解释更复杂的数据类型(例如,如果我们使用逗号(默认值),它将无法从包含逗号的字符串元素中分辨出来)

然后可以将目标数组展平为字符串数组:

// Transmogrify arr into a String[], usable with indexOf()
var arrSearch = arr.map(function(row) { return stringle(row); });
然后可以使用
Array.indexOf()
(或其他数组方法)检查匹配项的存在或位置

if (arrSearch.indexOf( stringle(newArray) ) === -1) ...
此代码段包含此功能的演示,具有多种数据类型

//示例启动数组
var arr=[[2,3]、[5,8]、[1,1]、[0,9]、[5,7];
//将数组展平为字符串,使用“唯一”分隔符分隔元素。
功能纵梁(arr){
返回arr.join(“|-|”);
}
log(“arr:+JSON.stringify(arr));
//将arr转换为字符串[],可与indexOf()一起使用
var arrSearch=arr.map(函数(行){返回字符串(行);});
log(“arrSearch:+JSON.stringify(arrSearch));
var测试=[[0,9],[1,2],“猪”,“牛”],[0,9,“独角兽”],[“猪”,“牛”];
用于(测试中的var测试){
var str=弦(测试[测试]);
if(arrSearch.indexOf(str)=-1){
arr.push(测试[测试]);
arrSearch.push(str);
log(“添加”+JSON.stringify(tests[test]);
}
否则{
log(“已经有”+JSON.stringify(tests[test]);
}
}
snippet.log(“结果:+JSON.stringify(arr));

您可以使用此方法

function isArrayItemExists(array , item) {
    for ( var i = 0; i < array.length; i++ ) {
        if(JSON.stringify(array[i]) == JSON.stringify(item)){
            return true;
        }
            }
            return false;
}
函数isArrayItemExists(数组,项){
对于(var i=0;i
不是一个完整的答案,只是一个可能有用的旁注

使用Lodash

此方法将获取值在二维数组中的位置

let a = [ [ 'bird' ], [ 'cat' ], [ 'dog' ], [ 'cow' ], [ 'bird' ] ];
let b = _.findIndex(a, function(el) { return el[0] == 'cow'; });
console.log(b);//answer is 3

如前所述,您需要一个嵌套循环来遍历数组。

非常简单,没有索引

var-arr=[[2,3]、[5,8]、[1,1]、[0,9]、[5,7];
常数isDup=(x,y)=>{
arr.find(it=>JSON.stringify(it)=JSON.stringify([x,y]))==undefined?arr.push([x,y]):null
}
console.log(isDup(2,3))/*不添加*/
log(isDup(1,2))/*不添加*/

console.log(arr)/*Confirmation*/
这里是一个使用prototype完成的解决方案,因此其用法类似于indexOf,但用于2d数组。使用方式相同:arr.indexOf2d([2,3])


下面是我实现的

getIndexOfArray(array: any[], findArray: any[]): number{
  let index = -1;
  array.some((item, i)=>{
    if(JSON.stringify(item) === JSON.stringify(findArray)) {
      index = i;
      return true;
    }
  });
  return index;
}
这里,
array
是我们需要索引的数组,
findArray
是将返回其索引的数组。
注意:此函数将仅返回第一次出现的
findArray
array insight
array
array。

ES2020更新 如果您能够支持ES2020,则可以使用新的(可选的链接操作符)。它可用于二维阵列,如下所示:

const arr=[[1,2],[3,4];
如果(!arr[5]?[6]){
log(“索引超出范围”);
}
if(arr[0]?[0]){
log(“边界中的索引”);
}
如果您试图访问anythin的属性
let a = [ [ 'bird' ], [ 'cat' ], [ 'dog' ], [ 'cow' ], [ 'bird' ] ];
let b = _.findIndex(a, function(el) { return el[0] == 'cow'; });
console.log(b);//answer is 3
var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];

Array.prototype.indexOf2d = function(item) {
    // arrCoords is an array with previous coordinates converted to strings in format "x|y"
    arrCoords = JSON.stringify(this.map(function(a){return a[0] + "|" + a[1]}));

    // now use indexOf to find item converted to a string in format "x|y"
    return arrCoords.indexOf(item[0] + "|" + item[1]) !== -1;
}
arr.indexOf2d([2,3]); // true
arr.indexOf2d([1,1]); // true
arr.indexOf2d([6,1]); // false
getIndexOfArray(array: any[], findArray: any[]): number{
  let index = -1;
  array.some((item, i)=>{
    if(JSON.stringify(item) === JSON.stringify(findArray)) {
      index = i;
      return true;
    }
  });
  return index;
}