Javascript如何知道一个数组是否是另一个数组的子数组

Javascript如何知道一个数组是否是另一个数组的子数组,javascript,arrays,Javascript,Arrays,如何在javascript中高效地执行以下操作 我有7个项目(项目0、项目1、项目2…项目6)的计数器。。 类似于计数=[0,2,0,5,6,0,9] 有3个相互排斥的组: 组1:item0、item1、item2 第2组:项目3、4、5 第3组:项目6 当且仅当组成员元素的计数器>=0时,组才被视为选中 现在我想知道选择了哪个组?在Undersack澄清后,OP表示,如果[至少]选择了一个组的元素,则选择该组。 这反过来又使问题的“互斥”部分变得模棱两可,因为提供的示例(计数=[0,2,0,5

如何在javascript中高效地执行以下操作

我有7个项目(项目0、项目1、项目2…项目6)的计数器。。 类似于计数=[0,2,0,5,6,0,9]

有3个相互排斥的组: 组1:item0、item1、item2 第2组:项目3、4、5 第3组:项目6

当且仅当组成员元素的计数器>=0时,组才被视为选中


现在我想知道选择了哪个组?

在Undersack澄清后,OP表示,如果[至少]选择了一个组的元素,则选择该组。
这反过来又使问题的“互斥”部分变得模棱两可,因为提供的示例(计数=[0,2,0,5,6,0,9])将选择所有3组

永远不会少…
通过依赖于对布尔表达式的JavaScript短路求值,可以最佳地解决识别所选组的问题

暂定解决方案如下所示:

counts = [0,2,0,5,6,0,9];  // as stated an bad value for counts,
                           // if groups are to be mutually exclusive
if (counts[0] || counts[1] || counts[2])
{
   GroupSelected = 1;
}
else if (counts[3] || counts[4] || counts[5])
{
   GroupSelected = 2;
}
else if (counts[6] > 0)
{
   GroupSelected = 3;
}
else
{
   GroupSelected = -1;  //  none of the groups is selected !!!
}
DS.setItem(0,0,1);
DS.setItem(1,2,1);
DS.setItem(2,0,1);
DS.setItem(3,5,2);
DS.setItem(4,6,2);
DS.setItem(5,0,2);
DS.setItem(6,9,3);
注:可能的优化来自于对待选择的给定元素的概率(相对于其组中的其他元素)以及待选择的给定组的概率的“先验”知识

有了这些知识,上面的代码片段可以重写为首先测试最可能的组,然后在每个组中首先测试最可能的元素。

这里有一个数据结构,可以实现您想要的功能

var DS = {
    Items: {},
    Groups: {},
    setItem: functon(index, item, group){
        this.Items[index] = item;
        if ( typeof this.Groups[group] === 'undefined' )
            this.Groups[group] = [index];
        else
            this.Groups[group].push(index);
    },
    isSelected: function(item) {
        return item >= 0;
    },
    isSelectedGroup: function(group) {
        var Group = this.Groups[group];
        for ( var i in Group ) {
            var Item = this.Items[i];
            if ( this.isSelected(Item) ) {
                return true;
            }
        }
    },
    getSelectedGroups: function(){
        var selected = [];
        for ( var group in this.Groups ) {
            var Group = this.Groups[group];
            if ( this.isSelectedGroup(Group) ) {
                selected.push(group);
            }
        }
        return selected;
    }
}
与物品一起使用:0,2,0,5,6,0,9。请执行以下操作:

counts = [0,2,0,5,6,0,9];  // as stated an bad value for counts,
                           // if groups are to be mutually exclusive
if (counts[0] || counts[1] || counts[2])
{
   GroupSelected = 1;
}
else if (counts[3] || counts[4] || counts[5])
{
   GroupSelected = 2;
}
else if (counts[6] > 0)
{
   GroupSelected = 3;
}
else
{
   GroupSelected = -1;  //  none of the groups is selected !!!
}
DS.setItem(0,0,1);
DS.setItem(1,2,1);
DS.setItem(2,0,1);
DS.setItem(3,5,2);
DS.setItem(4,6,2);
DS.setItem(5,0,2);
DS.setItem(6,9,3);
要测试:

DS.isSelectedGroup(3);
// or to get all selected groups
DS.getSelectedGroups();

如果不可行,您应该能够找到它:)

使用lodash库确定(子)数组的所有元素是否可以与另一个数组中的元素匹配

function arrayMatchesSubarray(arr, subarr) {
  var filteredSubarray = _.filter(subarr, function(subarrelement) {
    return _.any(arr, function(arrelement){
      return arrelement === subarrelement;
    });
  });
  return _.isEqual(subarr, filteredSubarray);
};
结果:

arrayContainsSubarray([1,2,3,4],[1,2]); // true
arrayContainsSubarray([1,2,3,4],[5,6,1]); // false
arrayContainsSubarray([1,2,3,4],[1,4,3]); // true

您可能需要考虑一种更好的数据结构来表示这一点。你已经有什么代码了?你能给我们看一下吗?@kinopiko,我还没有开始编码。@mjv:“当且仅当组成员元素的计数器大于等于0且至少有一个元素计数器大于0时,才认为组被选中”。我明白了。谢谢,我想我找到了更好的解决办法。在计数数组中,使每个计数器为0或1。计数器1表示实际计数大于0。现在对组执行xor。所以第1组是0000111,由前3个元素组成。请参见我在澄清后所做的编辑(关于所选组的构成)。你对XOR的想法很好,但是。。。a) 据我所知,js中唯一的XOR运算符是位运算符,然后需要将数组替换为整数,然后使用位运算来设置/重置给定的“元素”。b) 与XOR不同,您可能看到的是一个按位的AND,作为掩码c),这将使问题的性质发生一点变化(双关语的意思),因为现在您的“数组”不传递数字信息,而只传递布尔信息。@mjv:我想我给出的示例计数器数组不好。你提供的信息非常有用。谢谢