簡體   English   中英

如何檢查一個數組是否包含另一個數組?

[英]How to check if an array contains another array?

我需要二維數組,所以我制作了嵌套數組,因為 JavaScript 不允許它們。

他們看起來像這樣:

var myArray = [
      [1, 0],
      [1, 1],
      [1, 3],
      [2, 4]
    ]

如何檢查此數組是否包含 vanilla JS 中的特定元素(即這些[0,1]數組之一)?

這是我嘗試過的,但沒有成功(一切都返回false(編輯:我在代碼段中包含了答案)

 var myArray = [ [1, 0], [1, 1], [1, 3], [2, 4] ] var itemTrue = [2, 4]; var itemFalse = [4, 4]; function contains(a, obj) { var i = a.length; while (i--) { if (a[i] === obj) { return true; } } return false; } // EDIT : first answer's solution function isArrayInArray(x, check) { for (var i = 0, len = x.length; i < len; i++) { if (x[i][0] === check[0] && x[i][1] === check[1]) { return true; } } return false; } // EDIT : accepted answer's solution function isArrayInArray2(x, check) { var result = x.find(function(ele) { return (JSON.stringify(ele) === JSON.stringify(check)); }) return result !=null } console.log("true :" + myArray.includes(itemTrue)); console.log("false :" + myArray.includes(itemFalse)); console.log("true :" + (myArray.indexOf(itemTrue) != -1)); console.log("false :" + (myArray.indexOf(itemFalse) != -1)); console.log("true :" + contains(myArray, itemTrue)); console.log("false :" + contains(myArray, itemFalse)); // EDIT : first answer's solution console.log("true :" + isArrayInArray(myArray, itemTrue)); console.log("false :" + isArrayInArray(myArray, itemFalse)); // EDIT : accepted answer's solution console.log("true :" + isArrayInArray2(myArray, itemTrue)); console.log("false :" + isArrayInArray2(myArray, itemFalse));

它可能看起來像重復,但我找不到類似的問題。 如果是,請隨意標記它。

簡短易行,將數組字符串化並作為字符串進行比較

function isArrayInArray(arr, item){
  var item_as_string = JSON.stringify(item);

  var contains = arr.some(function(ele){
    return JSON.stringify(ele) === item_as_string;
  });
  return contains;
}

var myArray = [
  [1, 0],
  [1, 1],
  [1, 3],
  [2, 4]
]
var item = [1, 0]

console.log(isArrayInArray(myArray, item));  // Print true if found

在這里查看一些文檔

嵌套數組本質上是一個二維數組, var x = [[1,2],[3,4]]將是一個二維數組,因為我用 2 個索引引用它,例如x[0][1]將是2

關於您的問題,您可以使用普通循環來判斷它們是否包含在內,因為復雜數組不支持它:

var x = [[1,2],[3,4]];
var check = [1,2];
function isArrayInArray(source, search) {
    for (var i = 0, len = source.length; i < len; i++) {
        if (source[i][0] === search[0] && source[i][1] === search[1]) {
            return true;
        }
    }
    return false;
}
console.log(isArrayInArray(x, check)); // prints true

更新說明任何長度數組

function isArrayInArray(source, search) {
    var searchLen = search.length;
    for (var i = 0, len = source.length; i < len; i++) {
        // skip not same length
        if (source[i].length != searchLen) continue;
        // compare each element
        for (var j = 0; j < searchLen; j++) {
            // if a pair doesn't match skip forwards
            if (source[i][j] !== search[j]) {
                break;
            }
            return true;
        }
    }
    return false;
}
console.log(isArrayInArray([[1,2,3],[3,4,5]], [1,2,3])); // true

你不能那樣做 .instance 你必須自己做一些事情..首先你必須從你想要搜索的數組中做一個 foreach 並為你的數組的每個項目運行'compareArray'函數。

function compareArray( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;


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

    return true;

}

這是一個ES6解決方案:

myArray.some(
    r => r.length == itemTrue.length &&
         r.every((value, index) => itemTrue[index] == value)
);

檢查JSFiddle

看一看箭頭函數一些每個Array對象的方法。

D. Young 的注釋提供的用於檢查任何長度數組的代碼是錯誤的。 它只檢查第一個元素是否相同。

D. Young 評論的更正版本:

function isArrayInArray(source, search) {
    var searchLen = search.length;
    for (var i = 0, len = source.length; i < len; i++) {
        // skip not same length
        if (source[i].length != searchLen) continue;
        // compare each element
        for (var j = 0; j < searchLen; j++) {
            // if a pair doesn't match skip forwards
            if (source[i][j] !== search[j]) {
                break;
            } else if (j == searchLen - 1) {return true}
        }
    }
    return false; 
}

對於那些有興趣在另一個數組中查找數組並取回索引號的人,這里是mohamed-ibrahim 答案的修改版本:

function findArrayInArray(innerArray, outerArray) {
    const innerArrayString = JSON.stringify(innerArray);
    let index = 0;
    const inArray = outerArray.some(function (element) {
        index ++;
        return JSON.stringify(element) === innerArrayString;
    });
    if (inArray) {
        return index - 1;
    } else {
        return -1;
    }
}
findArrayInArray([1, 2, 3], [[3, .3], [1, 2, 3], [2]]); // 1
findArrayInArray([1, 2, 3], [[[1], 2, 3], [2]]) // -1

此函數返回您在外部數組中搜索的數組的索引,如果未找到,則返回 -1。

簽出這個CodePen

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM