用多层数组匹配字符串

Matching string with multilayered array

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

如何与变量数组匹配变量car ?我需要用字符串匹配每一个第一项(Buick、Mercedes、Chevrolet)。如果在这种情况下应该记录别克和雪佛兰:

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];

if (car = array) {
  console.log("Buick and Chevrolet matches.");  
};

但是string可以是不同的-有时可以是匹配项0,有时是30等等。

在现代Javascript中使用Set.filter:

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var searchCars = new Set(car.match(/'w+/g));
var found = array.filter(([name]) => searchCars.has(name));
console.log(found);

您可以在这里使用Array.reduce

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var matches = array.reduce(function(result, item){
  if(car.indexOf(item[0]) > -1) result.push(item);
  
  return result
}, []);
console.log(matches)

你将不得不循环数组,你可以检查匹配使用string.indexOf()

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var matches = [];
var matchesStr = "";
array.forEach(function(item){
  if(car.indexOf(item[0]) > -1){
    matches.push(item[0]);
  }
});
if(matches.length > 0){
  var _last = matches.pop();
  matchesStr = matches.toString() + " and " + _last;
}
else{
  matchesStr = matches.toString()
}
console.log(matchesStr)

另外,如果你有更新结构的选项,最好使用数组的对象,而不是数组的数组。

可以拆分字符串,遍历每个元素,并根据数组进行检查。

var car = "Buick, Chevrolet",
    array = [["Buick", "2012", "USA", "1201"], ["Mercedes", "2005", "Germany", "12354"], ["Chevrolet", "1974", "USA", "9401"]],
    match = car.split(', ').every(function (a) {
        return array.some(function (b) { return a === b[0]; });
    });
console.log(match);

var car = "Buick, Chevrolet",
    array = [["Buick", "2012", "USA", "1201"], ["Mercedes", "2005", "Germany", "12354"], ["Chevrolet", "1974", "USA", "9401"]],
    match = car.split(', ').every(function (a) {
        return array.some(function (b) { return a === b[0]; });
    });
if (match) {
    console.log(car.split(', ').join(' and ') + ' matches.');
}

使用数组操作filter和map可以生成所需的过滤。首先对数组进行筛选,只获取符合搜索条件的元素。然后我将其映射为只提取进一步操作所需的数据。

var string = "Buick, Chevrolet";
var cars = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var findCars= function( arr, str ){
   return arr.filter(
         function(s){
              return str.indexOf(s[0])!==-1;
         }
    ).map(
       function(x){
         return x[0];
       }
    );
}
var res = findCars(cars, string);
console.log( res.join(" and ") + " matches.")

如果稍后需要整个匹配的数据项,则应该跳过结果的映射,findCars方法将如下所示:

var findCars= function( arr, str ){
   return arr.filter(
         function(s){
              return str.indexOf(s[0])!==-1;
         }
    );
}

您可以使用reduce()检查与indexOf()

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var result = array.reduce(function(r, e, i) {
  if (car.indexOf(e[0]) != -1) {
    r.push(e[0]);
  }
  return r;
}, []).join(' and ') + ' matches.';
console.log(result)

var car = "Buick, Chevrolet";
var array = [
  ["Buick", "2012", "USA", "1201"],
  ["Mercedes", "2005", "Germany", "12354"],
  ["Chevrolet", "1974", "USA", "9401"]
];
var result = car
              .split(', ')
              .reduce(
                (res, car) =>
                  (array.some(([arrayCar]) => car === arrayCar ? res.push(car) : null), res),
                []);
console.log(`${result.join(' and ')} matches`);