我怎样才能以有效的方式在javascript中执行以下操作?
我按顺序反击了7项(item0,item1,item2 ... item6)。 比如在计数= [0,2,0,5,6,0,9];
有3个相互排斥的群体: group1:item0,item1,item2 group2:item3,4,5 group3:item6
当且仅当组成员元素的计数器为> = 0时,才会认为该组已被选中。
现在我想知道选择了哪个组?
答案 0 :(得分:1)
在通过反击进行澄清后,如果选择[至少]其中一个元素,则选择一个组。
这反过来使问题的“互斥”部分模糊不清,因为所提供的例子(计数= [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 !!!
}
注意:可能的优化将来自“先前”知道要选择的给定元素的概率(相对于其他人,在其组中),以及选择给定组的概率 有了这些知识,上面的代码片段可以重写为首先测试最可能的组,并在每个组中首先测试最可能的元素。
答案 1 :(得分:1)
这是一个可以做你想做的数据结构。
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();
应该有效,如果没有,你应该能够弄明白:)
答案 2 :(得分:1)
使用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