如何检查数组是否包含另一个数组?

时间:2017-01-15 12:50:42

标签: javascript arrays

我需要2d数组,所以我制作了嵌套数组,因为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));
&#13;
&#13;
&#13;

它可能看起来像重复但我无法找到类似的问题。如果是,请随意标记。

6 个答案:

答案 0 :(得分:6)

简单易行,将数组字符串化并比较为字符串

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

查看一些文档here

答案 1 :(得分:4)

嵌套数组本质上是一个二维数组,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

答案 2 :(得分:4)

你不能这样做。实例你必须自己做一些事情.. 首先,你必须从你想要搜索的数组中做一个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;

}

答案 3 :(得分:1)

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; 
}

答案 4 :(得分:0)

以下是ES6解决方案:

                $name = $_FILES['file']['name'];
                $fileName = substr($_FILES['file']['tmp_name'], 5).".".$ext;
                date_default_timezone_set('UTC');
                $fileDate = date('d.m.Y');
                $fileSize = $_FILES['file']['size'];
                $folder = $_POST['folder'];


                $target_dir="$media_dir/";
                $target_file= $target_dir .  basename($_FILES["file"]["name"]);

检查JSFiddle

查看arrow functions以及some对象的everyArray方法。

答案 5 :(得分:0)

对于那些有兴趣在另一个内部查找数组并获取索引号的人,这里是mohamed-ibrahim's answer的修改版本:

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