繁体   English   中英

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

[英]Javascript how to know if an array is subarray of another

我如何以有效的方式在javascript中执行以下操作?

我按顺序有7个项目(item0,item1,item2 ... item6)的计数器..例如,计数= [0,2,0,5,6,0,9];

共有3个互斥的组:组1:item0,item1,item2组2:item3、4、5组3:item6

当且仅当组成员元素的计数器> = 0时,才认为已选择一个组。

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

在通过堆垛进行澄清之后,如果选择了[至少]个元素之一,则选择一个组。
这反过来使问题的“ 互斥 ”部分变得模棱两可,因为提供的示例(计数= [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 !!!
}

注意: 可能的优化来自对要选择的给定元素 (相对于其组中其他元素)概率的 “先验”知识,以及对给定组的选择概率
有了这样的知识,可以将以上代码片段重写为首先对最可能的组进行第一次测试,并在每个组内首先对最可能的元素进行测试。

这是一个数据结构,可以执行您想要的操作。

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。 请执行下列操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM