2013-10-21 76 views
1

如何檢查Array是否包含另一個Array如何在數組中找到數組?

jQuery的$.inArray()array.indexOf([..., ..., ...])不工作..

+2

循環遍歷數組,然後使用'instanceof Array'來檢查 –

+1

然後使用'indexOf'! :) – MackieeE

回答

1

如果同時你的陣列只包含原語(如字符串或數字),最簡單的方法可能是遍歷數組並比較它們string representation

var arr = [ ['one'], ['one', 'three'], ['one', 'two', 'three'] ]; 
var search = ['one', 'three']; 

function arrayInArray(haystack, needle) { 
    needle = '' + needle; // needle.toString() 
    for(var i = 0; i < haystack.length; i++) { 
     if(needle === '' + haystack[i]) { 
      return i; 
     } 
    } 
    return -1; 
} 

console.log(arrayInArray(arr, search)); 
+0

非常感謝。 :) – andy

1

我看到另一個答案已被接受,但我現在已經輸入了這個,所以不妨將它發佈:)

比較字符串表示是一個聰明的解決方案,但它做mor E '手動' 這樣可能更可讀的不經意的觀察者,或者自己6個月...

function isArraysEqual(a, b) { 
    if(!a || !b || a === b || a.length !=b.length) { 
     return false; 
    } 

    for(var i = 0; i < a.length; ++i) { 
     if (a[i] !== b[i]) { 
      return false; 
     } 
    } 

    return true; 
} 

function arrayContainsArray(parent, child) { 
    for(var i = 0; i < parent.length; ++i) { 
     var candidate = parent[i]; 
     if(candidate instanceof Array && isArraysEqual(candidate, child)) { 
      return true; 
     } 
    } 
    return false;  
} 

var x = [[1,2,3],[4,5,6],[7,8,9]]; 
var y = [4,5,6]; 
var z = [10,11,12]; 

console.log("should be true: " + arrayContainsArray(x, y)); 
console.log("should be false: " + arrayContainsArray(x, z)); 
1

首先,代碼:

function equal(a, b) { 
    if (a == b) return true; 
    if (a instanceof Array && b instanceof Array) 
     return a.length == b.length && a.every(
      function (element, index) { return equal(element, b[index]); }); 
    return false; 
} 

function positionIf(array, predicate) { 
    for (var i = 0; i < array.length; i++) 
     if (predicate(array[i])) break; 
    return i; 
} 

var x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; 
var y = [4, 5, 6]; 
var z = [10, 11, 12]; 

function indexOfArray(array, element) { 
    return positionIf(
     array, function (searched) { return equal(searched, element); }); 
} 

// >>> indexOfArray(x, y); 
// 1 
// >>> indexOfArray(x, z); 
// 3 

說明:

  1. 無論其他問題如何,通用函數都是一件好事。這是一個恥辱,它不在標準庫中。但我相信許多流行的多用途圖書館提供了一個。

  2. Position-if是做這種操作的已知成語。您會在許多語言的標準庫中找到類似的功能,例如C++或Common Lisp。有一個很好,但可能有些庫已經提供了它,所以檢查它(可能是Underscore?)。

  3. 保持代碼更一般,可以在未來重用。

  4. 返回的索引是超過數組邊界的第一個索引,以防未找到元素。據我所知,唐納德克努特首先認爲這是一個更合乎邏輯的事情。我不會就此進行辯論,我恰好認爲這也是正確的做法。