我正在从数据库加载json文件,其中包含两个字段和等级。每个单词都被评分为例如,真有1,而谎有-1。然后我从文本提交输入,我需要根据JSON文件的成绩对其进行评分,然后通过总结成绩来计算得分,但我似乎无法找到这样做的方法。未计算文件中的单词。
我尝试过string.search匹配,但这很复杂,最终我无法按照我想要的方式得到结果。我试过数组搜索同样的事情。我搜索了在线解决方案,但没有人做过类似的事情,所以我无法复制它。
JSON
[
{"word":"true","grade":1},
{"word":"hate","grade":-1},
{"word":"dog","grade":0.8},
{"word":"cat","grade":-0.8}
]
字符串
“狗很棒,但我更喜欢猫,猫,我不能说谎,虽然狗是真正的朋友”。
答案 0 :(得分:0)
让我们首先想一想这个算法。两个选项:
由于JSON长度已知并且(我推测)比可能的输入字符串短,我倾向于选择选项2.
现在,在选择选项2之后,您需要将输入字符串拆分为单词并创建一个数组,其中包含数组的每个条目一个单词。
您可以使用mystring.split(" ")
方法实现此目的。当然,这并未考虑标点符号,但您可以使用相同的方法处理此问题。
现在,您可以在JSON中为每个条目添加一个字段,以计算字符串中JSON中每个条目的出现次数。
最后,您将计数器和等级的乘积相加。
答案 1 :(得分:0)
我要做的第一件事就是将您的JSON数据转换为可以轻松搜索的地图 - 关键是单词,并评估等级:
var json = [
{"word":"true","grade":1},
{"word":"hate","grade":-1},
{"word":"dog","grade":0.8},
{"word":"cat","grade":-0.8}
];
var map = json.reduce(function(p,c){
p.set(c.word.toLowerCase(),c.grade);
return p;
}, new Map());
console.log(...map);

然后,它只是一个分裂你的字符串的情况,同时也计算总分 - 再次reduce
可以使用
var json = [
{"word":"true","grade":1},
{"word":"hate","grade":-1},
{"word":"dog","grade":0.8},
{"word":"cat","grade":-0.8}
];
var map = json.reduce(function(p,c){
p.set(c.word.toLowerCase(),c.grade);
return p;
}, new Map());
var input = "Dogs are wonderful but i prefer cats cats i can not lie although dog is a true friend";
var score = input.split(' ').reduce(function(p,c){
var wordScore = map.get(c.toLowerCase()) || 0;
return p + wordScore;
},0);
console.log(score);

请注意,我已在上述输入中手动删除了标点符号 - 我将此作为练习留给您。
另请注意"cats" != "cat"
所以你的一些话语不会被发现!
答案 2 :(得分:0)
console.log((function(rules, str) {
var sum = 0;
Array.prototype.forEach.call(rules, function(rule) {
var match = str.match(rule.regexp);
match && (sum += str.match(rule.regexp).length * rule.grade);
console.log([rule.regexp, match&&match.length, rule.grade, match&&match.length * rule.grade, sum]);
});
return sum;
})([{
"regexp": /true/g,
"grade": 1
}, {
"regexp": /hate/g,
"grade": -1
}, {
"regexp": /dog/g,
"grade": 0.8
}, {
"regexp": /cat/g,
"grade": -0.8
}], "Dogs are wonderful but i prefer cats, cats, i can not lie although dog is a true friend"));
我使用regexp而不是字符串,你可以在运行时使用字符串并转换为正则表达式,希望这会有所帮助