2017-06-14 89 views
0

我試圖檢查一個座標[x,y,z]數組是否存在於其他座標[[x,y,z] ],[X 'Y',Z'],..]。我想知道indexOf可以在這裏使用。Typescript:搜索一個數組(行)是否存在於一個二維數組中

var ALLcoordinates:number[][]; 
ALLcoordinates = []; 

var coordinates: number[]; 
coordinates = [alea1, alea2, alea3]; 


for (var i=0; i< dims; i++) { 
    ALLcoordinates[i]=[]; 
    for (var j=0; j<chainSize; j++){ 
     ALLcoordinates[i][j]=0; 
    } 
} 

那麼我怎麼才能使「按行」打字稿搜索?我可以改編indexOf二維數組,還是必須使用循環?這裏是我的代碼,但是我在數據類型上遇到了一個明顯的錯誤:「類型'number []'的參數不能分配給'number'類型的參數。

if (coordinates.indexOf(ALLcoordinates) == -1) { 

     // do stuff 
} 

我會很高興任何幫助或想法,thanx!

回答

0

你可以爲它編寫一個function

let ALLcoordinates:number[][] = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]; 
let coordinates1: number[] = [1, 2, 3]; 
let coordinates2: number[] = [2, 3, 1]; 

function contains(array2d: number[][], array: number[]) { 
    let result = array2d.filter((item) => { 
     if(item.length === array.length) { 
      for(var i = 0; i < item.length; i++) { 
       if(item[i] !== array[i]) { 
        return false; 
       } 
      } 
      return true; 
     } 
     return false; 
    }); 
    return result.length > 0; 
} 

console.log(contains(ALLcoordinates, coordinates1)); //true 
console.log(contains(ALLcoordinates, coordinates2)); //false 

可測試Here(檢查控制檯輸出)

0

我聲明瞭兩個自定義類Vector3 & Pair

class Vector3 { 

    public constructor(
     public x: number, 
     public y: number, 
     public z: number 
    ) { } 

    public isEqual(vector: Vector3) { 
     return vector.x === this.x && 
      vector.x === this.x && 
      vector.x === this.x; 
    } 

} 

class Pair { 

    public constructor(
     private v1: Vector3, 
     private v2: Vector3 
    ) { } 

    public getIndex(vector: Vector3) { 
     if (this.v1.isEqual(vector)) return 0; 
     if (this.v2.isEqual(vector)) return 1; 
     return -1; 
    } 

    public contains(vector: Vector3) { 
     return this.getIndex(vector) !== -1; 
    } 

} 

那麼你最終會與你的使用情況很好API:

const v1 = new Vector3(1, 2, 3); 
const v2 = new Vector3(4, 5, 6); 
const v3 = new Vector3(7, 8, 9); 

const pair = new Pair(v1, v2); 

console.log(
    pair.contains(v1), // true 
    pair.contains(v2), // true 
    pair.contains(v3) // false 
); 
+1

這看起來不錯,但對我的項目來說有點「沉重」。如果indexOf不能應用,那麼我只會使用一個函數..謝謝:) –