如何在数组中查找数组?

时间:2013-10-21 20:28:08

标签: javascript jquery arrays contains

如何检查Array是否包含其他Array

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

我看到其他答案已被接受,但我现在已将其输入,所以不妨发布:)

比较字符串表示是一个聪明的解决方案,但是这样做“手动”可能对于不经意的观察者或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));

答案 2 :(得分: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. 无论其他问题如何,一般的equal功能都是件好事。遗憾的是它不在标准库中。但我相信很多流行的多功能库提供了一个。

  2. Position-if是用于执行此类操作的已知习惯用法。您将在许多语言的标准库中找到类似的函数,例如C ++或Common Lisp。有一个,但可能有一些图书馆已提供它,这是很好的,所以检查它(可能是下划线?)。

  3. 保持代码更加通用可以在将来重复使用。

  4. 返回的索引是超出数组边界的第一个索引,以防未找到任何元素。据我所知,唐纳德克努特首先认为这是一个更合乎逻辑的事情。我不会就此进行辩论,我恰巧相信这也是正确的事情。