[英]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.