如何检查数组元素是否匹配某种模式(例如:XXXXYY)?

时间:2018-09-26 09:22:30

标签: javascript arrays algorithm

例如,我有数组:

[1,2,3,2,2,2,1,2,3]

,它与模式XXXXYY相匹配,因为它具有(至少)四个'2'和两个'1',但是我的问题是,如何检查数组是否与该模式匹配?我尝试过:

const arr=[1,2,3,2,2,2,1,3,2];
const pattern=[4,2];
let m=new Map();
for(const num of arr){
  if(!m[num]){
    m[num]=0;
  }
  m[num]++;
}

let i=0;
let isMatch=true;
for(const key in m){
  if(m[key]<pattern[i]){
    isMatch=false;
  }
  i++;
}
console.log(isMatch);

但是isMatch为假。有没有更简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以对值进行计数,然后进行排序计数并对照排序模式进行检查。

var DESC = (a, b) => b - a,
    array = [1, 2, 3, 2, 2, 2, 1, 3, 2],
    pattern = [4, 2],
    count = Array
        .from(array.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map).values())
        .sort(DESC),
    check = pattern
        .sort(DESC)
        .every((c, i) => count[i] >= c);
    
console.log(check);        
console.log(count);