简体   繁体   English

匹配字符串与多层数组

[英]Matching string with multilayered array

How can i match variable car with variable array? 如何将可变汽车与可变阵列匹配? I need to match every first item (Buick, Mercedes, Chevrolet) with my string. 我需要将每个第一项(别克,梅赛德斯,雪佛兰)与我的琴弦相匹配。 I this case should be logged Buick and 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.");  
};

But string could be different - sometimes may be matched items 0, sometimes 30 and so on. 但是字符串可能会有所不同-有时可能匹配项0,有时是30,依此类推。

In modern Javascript you use Set and .filter for this: 在现代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); 

You could split the string and iterate for every element and check against the array. 您可以拆分字符串并为每个元素进行迭代,然后检查数组。

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

You can use reduce() check for element with indexOf() 您可以使用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) 

You can use Array.reduce here 您可以在此处使用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) 

You will have to loop over array and you can check for match using string.indexOf() 您将必须遍历数组,并且可以使用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) 

Also, if you have option to update your structure, its better to have array of object instead of array of arrays. 另外,如果您可以选择更新结构,则最好使用对象数组而不是数组数组。

Using array operations filter and map you can produce the desired filtering. 使用数组运算过滤器和映射,您可以产生所需的过滤。 First filter the array to get only elements that match the search criteria. 首先过滤数组以仅获取与搜索条件匹配的元素。 Then I map it to extract only data that is required for further operation. 然后,我将其映射为仅提取进一步操作所需的数据。

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

If you need the whole matching data item later, then you should skip the mapping of the result and findCars method will look like this: 如果以后需要整个匹配的数据项,则应跳过结果的映射,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