簡體   English   中英

根據數組過濾字符串數組

[英]Filter array of strings against array

我有這樣的字符串數組

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()時可能會失敗。 例如: 如果string包含166將匹配 因此,我們可以將regexObj.test(str)match()與單詞邊界regex一起使用,以提高准確性。

 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並減少謂詞是regexp的地方,該regexp可檢查該值是否與整個單詞中的過濾器中的所有值匹配。

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)
  })
});

 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;    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM