根据this Codewars challenge,我需要创建一些简单的逻辑来跟踪字符串中出现的所有单词。
说明
一些新的收银员开始在您的餐厅工作。
他们擅长接单,但是他们不知道如何大写单词或使用空格键!
他们创建的所有订单如下所示:
“奶昔披萨鸡扒薯条可乐汉堡披萨和三明治奶昔披萨”
由于难以阅读订单,厨房工作人员威胁要辞职。
他们的偏好是将订单作为一个干净的,带有空格和大写字母的字符串来获得,如下所示:
“汉堡薯条鸡肉比萨比萨比萨三明治奶昔奶昔可乐”
厨房工作人员希望这些物品的顺序与菜单中显示的顺序相同。
菜单项非常简单,项目名称没有重叠:
编辑按照.match()
逻辑,我创建了一个 all 项的数组,这些项出现在输入中。但是我不知道根据原始字符串中出现的顺序对它们进行排序的最快方法:
function getOrder(order) {
let menu = ['Burger', 'Fries', 'Chicken', 'Pizza', 'Sandwich', 'Onionrings', 'Milkshake', 'Coke'];
let finalOrder = order.split(/(burger|fries|chicken|pizza|sandwich|onionrings|milkshake|coke)/i);
finalOrder = finalOrder.filter((element) => element !== null || element !== "");
finalOrder = finalOrder.map((element) => element.charAt(0).toUpperCase() + element.slice(1));
finalOrder = finalOrder.sort((a, b) => {
if (menu.indexOf(a) > menu.indexOf(b)) {
return 1;
}
else {
return -1;
}
});
return finalOrder.join(" ").trim(/\s/);
}
console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));
答案 0 :(得分:2)
使用includes
代替indexOf
。这需要第二个参数,即索引以开始搜索。例如,循环遍历所有汉堡,并将上一个索引传递到下一个indexOf
调用,直到返回-1,然后计算循环的频率。
或者,您可以.match
基于接受所有可能菜肴的正则表达式来编写文本。
答案 1 :(得分:2)
这是我应对挑战的解决方案:
说明:
对于每个菜单项:计算该菜单项的出现次数,并将该菜单项多次添加到输出字符串中。
RegExp(i, 'gi')
:案例 i 不敏感的 g 用于计数的局部匹配|| []
:处理匹配项0次.length
:仅获得匹配项 Array().fill(i)
:重复创建包含菜单项的大小数组...
:展开数组,以便在数组中分别插入元素.join(' ')
:最后,在每个匹配项之间插入空格示例:
let menu = ['Burger','Fries','Chicken','Pizza','Sandwich','Onionrings','Milkshake','Coke'];
function getOrder(input) {
let output = [];
menu.forEach( (i) =>
output.push( ...Array( (input.match( RegExp(i, 'gi') ) || []).length ).fill( i ) )
);
return output.join(' ');
}
console.log( getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza") )
答案 2 :(得分:1)
如果您知道单词在字符串中的 位置,则可以将其删除,这样,如果再次查看其余字符串,则会找到重复的字符串。
答案 3 :(得分:1)
您还可以逐个字符地迭代,并在单词形成时附加单词。要检查单词是否“形成”,可以使用一组存储有效的单词/菜单项:
function getOrder(input) {
let order = [];
const items = new Set(["burger", "fries", "chicken", "pizza", "sandwich", "onionrings", "milkshake", "coke"]);
let curr = "";
for (let c of [...input]) {
curr += c;
if (items.has(curr)) {
order.push(curr);
curr = "";
}
}
return order.map(item => item.charAt(0).toUpperCase() + item.slice(1)).join(" ");
}
console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));
答案 4 :(得分:1)
以给定的顺序创建一个包含小写菜单项的数组
let testString = "milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza";
let menuItemsLowerCase = ["burger","fries","chicken","pizza","sandwich","onionrings","milkshake","coke"];
遍历每个项目,并用项目字符串和逗号替换每个项目的出现
for(let itemIndex=0;itemIndex<menuItemsLowerCase.length; itemIndex++){
const item = menuItemsLowerCase[itemIndex];
const re = new RegExp(item,"g");
testString = testString.replace(re, item+',');
}
如果有则删除最后一个逗号
if(testString[testString.length-1] === ','){
testString = testString.substr(0,testString.length-1);
}
将字符串拆分为逗号并进行排序
let stringAsArray = testString.split(',');
stringAsArray = stringAsArray.sort(function(a,b){
return menuItemsLowerCase.indexOf(a) - menuItemsLowerCase.indexOf(b);
});
将第一个字符转换为大写字母,并以空格作为分隔符重新加入
console.log(stringAsArray.map(function(item){
return item.substr(0,1).toUpperCase() + item.substr(1);
}
).join(' '));
答案 5 :(得分:0)
function getOrder(input) {
let menu = ['Burger','Fries','Chicken','Pizza','Sandwich','Onionrings','Milkshake','Coke'];
let items = input.match(/(burger|fries|chicken|pizza|sandwich|onionrings|milkshake|coke)/gi);
items = items.map((element) => element.charAt(0).toUpperCase() + element.slice(1));
items = items.sort((a, b) => {
if (menu.indexOf(a) > menu.indexOf(b)) {
return 1;
}
else {
return -1;
}
});
return items.join(" ");
}
console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));