根据数组筛选字符串数组

Filter array of strings against array

本文关键字:数组 字符串 筛选      更新时间:2023-09-26

我有一个类似的字符串数组

values[0]='1,3,16,5,12,43,13';
values[1]='7,1,3,16,5,23,49,26,13';
values[2]='13,1,3,16,5,23,49,26,12';
// etc.

另一方面,我有一个阵列

filter[0]='13';
filter[1]='12';
filter[2]='3';`

我想找到字符串中包含所有筛选项的值的所有实例(在这种情况下,values[0]values[2]会匹配,values[1]不会匹配,因为缺少12)。我已经试了几个小时了,我想这真的很容易,但我似乎找不到解决方案。

如果jQuery有帮助的话,它是一个选项。

您可以使用filter()every()进行

var values = ['1,3,16,5,12,43,13', '7,1,3,16,5,23,49,26,13', '13,1,3,16,5,23,49,26,12'],
  filter = [13, 12, 3];
var res = values.filter(function(v) { // filter array
  return filter.every(function(fil) { // checking all elements are in the string 
    return v.indexOf(fil) > -1;
  });
})
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');


更新:

使用indexOf()时可能会失败。例如:如果字符串包含16,则6将匹配。因此,为了获得更高的精度,我们可以将regexObj.test(str)match()与单词边界正则表达式一起使用。

var values = ['1,3,16,5,12,43,13', '7,1,3,16,5,23,49,26,13', '13,1,3,16,5,23,49,26,12'],
  filter = [13, 12, 3];
var res = values.filter(function(v) { // filter array
  return filter.every(function(fil) { // checking all elements are in the string 
    return new RegExp('''b' + fil + '''b').test(v);
    // or return v.match(new RegExp('''b' + fil + '''b'));
  });
})
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');

您可以使用filter和reduce,其中谓词是一个正则表达式,用于检查值是否与筛选器中的所有值作为一个完整单词匹配。

var values = ['1,3,16,5,12,43,13', '7,1,3,16,5,23,49,26,13', '13,1,3,16,5,23,49,26,12'];
var filter = [13, 12, 3];
var filteredValues = values.filter(function(value){
  return filter.reduce(function(p,c){
    return p && new RegExp('''b'+c+'''b').test(value)
  })
});
  • map()
  • split()
  • filter()
  • every()
  • indexOf()
  • join()

var values = [
  '1,3,16,5,12,43,13', 
  '7,1,3,16,5,23,49,26,13', 
  '13,1,3,16,5,23,49,26,12'
]
var filter = ['13', '12', '3']
var filteredValues = values.map(function(str) {
  return str.split(',')
}).filter(function(nums) {
  return filter.every(function(n) {
    return ~nums.indexOf(n)
  })
}).map(function(nums) {
  return nums.join(',')
})
console.log(filteredValues.join(''n'))

这里有一种方法:

var matches = values.filter(function(str) {
  return filter.every(function(item) {
    return str.split(',').indexOf(item) >= 0;
  });
});

这应该会有所帮助:

function findMatchedValues() {
  var count;
  var output_array = [];
  $.each(values, function(v_index, v_val) {
    count = 0;
    $.each(filters, function(f_index, f_val) {
      if ($.inArray(f_val, v_val.split(",")) !== -1) {
        ++count;
      }
    });
    if (count === filters.length) {
      output_array.push(v_val);
    }
  });
  return output_array;    
}