将标题字段与数组进行比较时避免错误
Avoid errors when comparing title field to an array
以下代码从我的页面标题中获取第一个单词,将其与数组的值进行比较并输出最终值:
var fulltitle = "Deep Blue Shoes";
var arr = fulltitle.split(' ').slice(0, 1);
var title = arr && arr.length ? arr[0] : "";
//test variables
testarray = ["blue", "top", "110", "in stock", "deep blue", "down", "111", "in stock"]
//function
function testfunction(array, variable) {
var varindex = array.indexOf(variable.toLowerCase())
return array[varindex + 2]
}
//calling the function
var finalvalue = testfunction(testarray, title);
console.log( finalvalue )
在这种情况下,如果我的标题是Deep Blue shoes,系统会过早地切割标题并尝试将值'deep' 与数组中的值进行比较。但是值 deep 不存在。
我正在尝试为这个问题和可能出现的类似问题找到解决方案,因为我的变量可能像 'blue'、'deep blue'、'deep blue sky'。我们只处理完全匹配。
你会如何解决这个问题?
您可以使用字符串(或 RegEx)比较吗?
但在第一个示例中,它同时匹配 "blue" 和 "deep blue"(在第二个示例中匹配 "acquacalda" 和 "acqua")。
在这些情况下我们应该使用什么逻辑?如果匹配多个,如果一个比其他的多(即,在这种情况下,选择"deep blue"),则选择单词最多的一个,如果匹配的单词数相同,则选择较长的一个这两个词?即在第二种情况下选择 "acquacalda" 而不是 "acqua"? (一般来说,总是选择更具体的答案)
见下文和https://jsfiddle.net/alexander_L/gx83mrtL/3/
findPage("Deep Blue Shoes");
findPage("Acquacalda");
function findPage(fulltitle){
//test variables
const testarray = ["blue", "top", "110", "in stock", "deep blue", "down", "111", "in stock", "acqua", "top", "112", "in stock", "acquacalda", "down", "113", "in stock"]
const altMatches = testarray.reduce((aggArr, item) => {
if (fulltitle.toLowerCase().includes(item)){
console.log('we have a match with ' + item);
aggArr.push(item);
}
return aggArr;
}, []);
//then we can choose the "largest" match:
const finalMatch = altMatches.reduce((aggMatch, item) => {
if (aggMatch == null || (aggMatch.split(' ').length < item.split(' ').length) || (aggMatch.length < item.length)){
return item;
}
return aggMatch;
}, null);
console.log('the final match is ' + finalMatch);
const finalPage = testarray.indexOf(finalMatch) + 2;
console.log('the final match page number is ' + testarray[finalPage]);
}
输出:
"we have a match with blue"
"we have a match with deep blue"
"the final match is deep blue"
"the final match page number is 111"
"we have a match with acqua"
"we have a match with acquacalda"
"the final match is acquacalda"
"the final match page number is 113"
一开始我只是通过修改这段代码就用技巧解决了这个问题
var fulltitle = (document.title);
var arr = fulltitle.split(':').slice(0, 1);
由于我们需要的标题部分总是在':'之前,这样我就可以在不进行高级比较的情况下得到正确的结果。
以下代码从我的页面标题中获取第一个单词,将其与数组的值进行比较并输出最终值:
var fulltitle = "Deep Blue Shoes";
var arr = fulltitle.split(' ').slice(0, 1);
var title = arr && arr.length ? arr[0] : "";
//test variables
testarray = ["blue", "top", "110", "in stock", "deep blue", "down", "111", "in stock"]
//function
function testfunction(array, variable) {
var varindex = array.indexOf(variable.toLowerCase())
return array[varindex + 2]
}
//calling the function
var finalvalue = testfunction(testarray, title);
console.log( finalvalue )
在这种情况下,如果我的标题是Deep Blue shoes,系统会过早地切割标题并尝试将值'deep' 与数组中的值进行比较。但是值 deep 不存在。
我正在尝试为这个问题和可能出现的类似问题找到解决方案,因为我的变量可能像 'blue'、'deep blue'、'deep blue sky'。我们只处理完全匹配。
你会如何解决这个问题?
您可以使用字符串(或 RegEx)比较吗?
但在第一个示例中,它同时匹配 "blue" 和 "deep blue"(在第二个示例中匹配 "acquacalda" 和 "acqua")。
在这些情况下我们应该使用什么逻辑?如果匹配多个,如果一个比其他的多(即,在这种情况下,选择"deep blue"),则选择单词最多的一个,如果匹配的单词数相同,则选择较长的一个这两个词?即在第二种情况下选择 "acquacalda" 而不是 "acqua"? (一般来说,总是选择更具体的答案)
见下文和https://jsfiddle.net/alexander_L/gx83mrtL/3/
findPage("Deep Blue Shoes");
findPage("Acquacalda");
function findPage(fulltitle){
//test variables
const testarray = ["blue", "top", "110", "in stock", "deep blue", "down", "111", "in stock", "acqua", "top", "112", "in stock", "acquacalda", "down", "113", "in stock"]
const altMatches = testarray.reduce((aggArr, item) => {
if (fulltitle.toLowerCase().includes(item)){
console.log('we have a match with ' + item);
aggArr.push(item);
}
return aggArr;
}, []);
//then we can choose the "largest" match:
const finalMatch = altMatches.reduce((aggMatch, item) => {
if (aggMatch == null || (aggMatch.split(' ').length < item.split(' ').length) || (aggMatch.length < item.length)){
return item;
}
return aggMatch;
}, null);
console.log('the final match is ' + finalMatch);
const finalPage = testarray.indexOf(finalMatch) + 2;
console.log('the final match page number is ' + testarray[finalPage]);
}
输出:
"we have a match with blue"
"we have a match with deep blue"
"the final match is deep blue"
"the final match page number is 111"
"we have a match with acqua"
"we have a match with acquacalda"
"the final match is acquacalda"
"the final match page number is 113"
一开始我只是通过修改这段代码就用技巧解决了这个问题
var fulltitle = (document.title);
var arr = fulltitle.split(':').slice(0, 1);
由于我们需要的标题部分总是在':'之前,这样我就可以在不进行高级比较的情况下得到正确的结果。