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

时间:2018-04-07 11:30:41

标签: javascript arrays

假设我有数组父和子。我想检查一个子数组是否存在于父数组中。订购很重要。
示例:

parent = ["x", "a", "b", "c", "d", "e", "f", "g"]
child = ["a", "b", "c"]
//returns true

例:
当父母有不同的顺序时:

parent = ["x", "g", "b", "c", "d", "e", "f", "a"]
child = ["a", "b", "c"]
//It should return false   

我如何在Javascript中实现这一点?
编辑:我已经尝试了这个How to check if an array contains another array?,但它对我的情况不起作用

6 个答案:

答案 0 :(得分:3)

您可以为child运行循环并相应地更改索引。您还可以使用match变量来检测序列中的更改。

返回



var parent = ["x", "a", "b", "c", "d", "e", "f", "g"]
var child = ["a", "b", "c"];

var initIndex = parent.indexOf(child[0]);
var match = true;
for(var i=1; i<child.length; i++){
  var varIndex = parent.indexOf(child[i]);
  if( varIndex === initIndex+1){
    initIndex = varIndex;
    continue;
  }
  match = false;
}

console.log(match);
&#13;
&#13;
&#13;

返回错误

&#13;
&#13;
var parent = ["x", "g", "b", "c", "d", "e", "f", "a"]
var child = ["a", "b", "c"];

var initIndex = parent.indexOf(child[0]);
var match = true;
for(var i=1; i<child.length; i++){
  var varIndex = parent.indexOf(child[i]);
  if( varIndex === initIndex+1){
    initIndex = varIndex;
    continue;
  }
  match = false;
}

//return false
console.log(match);
&#13;
&#13;
&#13;

使用字符串操作

您也可以将数组转换为字符串以避免这些循环:

&#13;
&#13;
var parent = ["x", "g", "b", "c", "d", "e", "f", "a"]
var child = ["a", "b", "c"]

var parentStr = parent.toString();
var match = parentStr.indexOf(child.toString()) !== -1;
//return false
console.log(match);

parent = ["x", "a", "b", "c", "d", "e", "f", "g"]
child = ["a", "b", "c"]

parentStr = parent.toString();
match = parentStr.indexOf(child.toString()) !== -1;
//return true
console.log(match);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

&#13;
&#13;
var parent = ["x", "g", "b", "c", "d", "e", "f", "a"]
var child = ["a", "b", "c"]

if(parent.join("").search(child.join("")) === -1) {
    console.log("Not found");
} else {
    console.log("found")
}
&#13;
&#13;
&#13;

答案 2 :(得分:1)

使用JSON.stringify()将数组转换为字符串,并从子字符串中删除方括号。

现在检查父母中的indexOf孩子,检查它是否包含孩子。

&#13;
&#13;
let parent = ["x", "a", "b", "c", "d", "e", "f", "g"];
let child = ["a", "b", "c"];
var parStr = JSON.stringify(parent);
var chldStr = JSON.stringify(child).replace('[', '').replace(']', '')

console.log(parStr.indexOf(chldStr) !== -1);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您可以迭代parent数组并使用children数组的索引,如果找到最后一个子数,则返回true

&#13;
&#13;
function check(parent, children) {
    var index = 0;
    return parent.some(p => p === children[index] && ++index === children.length);
}

console.log(check(["x", "a", "b", "c", "d", "e", "f", "g"], ["a", "b", "c"]));
console.log(check(["x", "g", "b", "c", "d", "e", "f", "a"], ["a", "b", "c"]));
&#13;
&#13;
&#13;

使用indexOf

的其他方法

&#13;
&#13;
function check(parent, children) {
    return children.every((i => c => (i = parent.indexOf(c, i)) !== -1)(0));
}

console.log(check(["x", "a", "b", "c", "d", "e", "f", "g"], ["a", "b", "c"]));
console.log(check(["x", "g", "b", "c", "d", "e", "f", "a"], ["a", "b", "c"]));
&#13;
&#13;
&#13;

答案 4 :(得分:1)

对于这个问题的小型数组,我有一个简单的方法。

  1. 首先将数组连接到字符串,请参阅Array/join
  2. 搜索子字符串,请参阅String/indexOf
  3. parent = ["x", "a", "b", "c", "d", "e", "f", "g"];
    child = ["a", "b", "c"];
    function matchSubArray(parent, child) {
        parentStr = parent.join('');
        childStr = child.join('');
        return parentStr.indexOf(childStr) != -1;
    }
    matchSubArray(parent, child);

答案 5 :(得分:1)

我为此写了一个函数,需要一些参数:

Array.prototype.containsArray = function (child, orderSensitivity, caseSensitivity, typeSensitivity) {
    var self = this;
    if (orderSensitivity) return orderSensitiveComparer();
    else return orderInsensitiveComparer();

    function orderSensitiveComparer() {
        var resultArry = [],
            placeholder = 0;
        if (child.length > self.length) return false;
        for (var i = 0; i < child.length; i++) {
            for (var k = placeholder; k < self.length; k++) {
                if (equalityComparer(self[k], child[i])) {
                    resultArry.push(true);
                    if (resultArry.length === child.length) return true;
                    placeholder = k + 1;
                    break;
                }
                else resultArry = [];
            }
        }
        return false;
    }
    function orderInsensitiveComparer() {
        for (var i = 0; i < child.length; i++) {
            var childHasParentElement = false;
            for (var k = 0; k < self.length; k++) {
                if (equalityComparer(child[i], self[k])) {
                    childHasParentElement = true;
                    break;
                }
            }
            if (!childHasParentElement) return false;
        }
        return true;
    }
    function equalityComparer(a, b) {

        if (caseSensitivity && typeSensitivity) return caseSensitiveEq(a, b) && typeSensitiveEq(a, b);
        else if (!caseSensitivity && typeSensitivity) return caseInsensitiveEq(a, b) && typeSensitiveEq(a, b);
        else if (caseSensitivity && !typeSensitivity) return caseSensitiveEq(a, b) && typeInsensitiveEq(a, b);
        else if (!caseSensitivity && !typeSensitivity) return caseInsensitiveEq(a, b) && typeInsensitiveEq(a, b);
        else throw "Unknown set of parameters";


        function caseSensitiveEq(a, b) {
            return a == b;
        }
        function caseInsensitiveEq(a, b) {
            return (a + "").toLowerCase() == (b + "").toLowerCase();
        }
        function typeSensitiveEq(a, b) {
            return typeof(a) === typeof(b);
        }
        function typeInsensitiveEq(a, b) {
            return true;
        }
    }
}

var parent = [1, 2, 3, "a", "b", "c"];
var child = [1, 2, 3];
var child2 = ["1", "2", "3"];
var child3 = ["A", "b", "C"];
var child4 = ["a", "b", "c"];
var child5 = ["c", "b", "a"];


// Tests:
console.log(parent.containsArray(parent));
console.log(parent.containsArray(child));
console.log(parent.containsArray(child2));

// parent to child 2, order sensitive, not case, not type. => true.
console.log(parent.containsArray(child2, true, false, false));

// parent to child 2, order, not case, type. => false. b/c of type.
console.log(parent.containsArray(child2, true, false, true));

// parent to child 3, order, not case, type. => true.
console.log(parent.containsArray(child3, true, false, true));

// parent to child 4, order, case and type => true.
console.log(parent.containsArray(child4, true, true, true));

// parent to child 4, not order, case and type. => true.
console.log(parent.containsArray(child4, false, true, true));

// parent to child 5, not order case or type => true.
console.log(parent.containsArray(child5));