当涉及到编码时,我是一个完全的初学者,但我正在努力完成以下任务。
我有一个多维数组,像这样:
var requiredProducts = [{
product: 'PRODUCT 1',
keywords: ['KEYWORD1', 'KEYWORD2', 'KEYWORD3'],
price: '50.00'
},{
product: 'PRODUCT 2',
keywords: ['KEYWORD4', 'KEYWORD5', 'KEYWORD6'],
price: '50.00'
}];
我正在从HTML元素中检索字符串,例如:
这个字符串太棒了,它包含KEYWORD1、KEYWORD3和KEYWORD2
如何检查字符串是否包含任何关键字数组中的所有关键字(关键字的顺序应该无关紧要)。这几天我一直在尝试各种各样的事情,除了头痛之外,什么也没有取得任何进展。
感谢您的帮助。
如果它有帮助,这是我试图添加它的代码块。新函数应该从'***'中调用,并允许在所有关键字都找到的情况下继续执行此函数。
function checkPopup(jNode) {
console.log(scriptName + 'Found new popup.');
console.log(scriptName + 'Checking popup...');
linkText = jNode.attr("title");
linkText = linkText.toUpperCase();
console.log(scriptName + 'Popup: ' + linkText);
if *** {
console.log(scriptName + 'Popup matched.');
} else {
console.log(scriptName + 'Product not matched.');
}
}
我假设您没有使用外部模块或库来计算两个数组的交集。试试这个:
var phrase = "This string is fantastic, it contains KEYWORD1 and KEYWORD3, and KEYWORD2";
var words = phrase.split(/[s,]/);
var results = []
requiredProducts.forEach(function (item) {
var intersection = item.keyword.filter(function(value) {
return words.indexOf(value) > -1;
});
results.push({
product: item.product,
match: item.keyword.length === intersection.length,
intersection: intersection
});
});
console.log(results);
您可以使用Array.prototype.every
,它将对数组中的项运行谓词函数,并且只有在每次迭代返回true时才返回true。
请注意Array.prototype.every
仅在现代浏览器中支持。
var requiredProducts = [{
product: 'PRODUCT 1',
keyword: ['KEYWORD1', 'KEYWORD2', 'KEYWORD3'],
price: '50.00'
}, {
product: 'PRODUCT 2',
keyword: ['KEYWORD4', 'KEYWORD5', 'KEYWORD6'],
price: '50.00'
}];
var str1 = 'This string is fantastic, it contains KEYWORD1 and KEYWORD3, and KEYWORD2'
var str2 = 'This string is fantastic, it contains KEYWORD4 and KEYWORD5, and KEYWORD6'
function matchProductByKeywords(str, products) {
return products.filter(function(product){
return product.keyword.every(
function(word) {
return str.match(word)
}
)
})
}
console.log(
'str1', matchProductByKeywords(str1, requiredProducts),
'str2', matchProductByKeywords(str2, requiredProducts)
)
这里是每个你可以使用的垫片。对于不支持的浏览器
Array.prototype.every = Array.prototype.every || function(predicate){
for (var ii = 0, ll = this.length; ii < ll; ii+=1) {
if (!predicate.call(this, this[ii], ii, this)) {
return false
}
}
return true
}