繁体   English   中英

匹配字符串与多层数组

[英]Matching string with multilayered array

如何将可变汽车与可变阵列匹配? 我需要将每个第一项(别克,梅赛德斯,雪佛兰)与我的琴弦相匹配。 我这种情况下应该登录别克和雪佛兰:

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

但是字符串可能会有所不同-有时可能匹配项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); 

您可以拆分字符串并为每个元素进行迭代,然后检查数组。

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

您可以使用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) 

您可以在此处使用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 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;
         }
    );
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM