如果包含特定单词,则从数组返回匹配项

时间:2018-12-13 07:08:08

标签: javascript arrays multiple-matches

我有一个包含几个国家/地区的数组,后跟一个选项和一个数字。

0“英国一150”

1“瑞士两个70”

2“中国两个120”

3“瑞士一号45”

4“中国一90”

5“英国两50”

这就是我使用xpath获取数组的方式:

    var iterator = document.evaluate('//xpath/li[*]', document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);

try {
  var thisNode = iterator.iterateNext();
  var arrayList = [];

  while (thisNode) {
    arrayList.push(thisNode.textContent); 
    thisNode = iterator.iterateNext();
  }

  for (var i = 0; i < arrayList.length; i++) {
    console.log(arrayList[i]);
  }   
} catch (e) {
  dump('Error' + e);
}
arrayList

我想对这个数组做的是整理并仅返回匹配项。例如。我希望它只返回英国和中国,所以数组看起来像这样。

0“英国一150”

1个“中国两个120”

2“中国一90”

3英寸英国两50英寸

3 个答案:

答案 0 :(得分:1)

您可以在sort() filter()regex的帮助下完成此操作

我要做的是首先过滤包含UKChina的所有元素。

现在在此过滤后的数组上,我需要使用正则表达式捕获数字并按降序对其进行排序。

let arr =[
"UK One 150 ",
"Switzerland Two 70 ",
"China Two 120 ",
"Switzerland One 45 ",
"China One 90 ",
"UK Two 50 ",
];

let op = arr.filter(e=> 
    /(UK|China)/gi.test(e))
   .sort((a,b)=>{a.match(/\d+/g) - b.match(/\d+/g)}
 );
 
console.log(op);

答案 1 :(得分:1)

您可以使用正则表达式过滤数组,然后对数值进行排序。

let data =["UK One 150 ","Switzerland Two 70 ","China Two 120 ","Switzerland One 45 ","China One 90 ","UK Two 50 "],
  result = ((arr) => data.filter(s => new RegExp(arr.join('|'), 'ig').test(s)))(['UK', 'China'])
          .sort((a,b)=> +a - +b);
console.log(result);

答案 2 :(得分:1)

您可以使用Schwartzian transform的形式通过提取国家/地区的名称以及使用array.map()和正则表达式的数字来“修饰”数据。

现在您可以按国家/地区进行过滤,按数字排序并使用其他地图提取str。

const arr =[
"UK One 150 ",
"Switzerland Two 70 ",
"China Two 120 ",
"Switzerland One 45 ",
"China One 90 ",
"UK Two 50 ",
];

const pattern = /^(\S+)\D+(\d+)/;
const requestedCounteries = new Set(['UK', 'China']);

const result = arr
  .map(str => str.match(pattern)) // ['UK One 150 ', 'UK', '150']
  .filter(([,country]) => requestedCounteries.has(country))
  .sort(([,,a], [,,b]) => +b - +a)
  .map(([str]) => str);
 
console.log(result);