代码之家  ›  专栏  ›  技术社区  ›  HappyHands31

创建不带空格的字符串中出现的单词列表-说明单词出现多次时的情况

  •  0
  • HappyHands31  · 技术社区  · 5 年前

    this Codewars challenge ,我需要创建一些简单的逻辑来跟踪字符串中出现的所有单词。


    说明书

    一些新的收银员开始在你的餐厅工作。

    他们善于接受命令,但他们不知道如何大写单词,或使用空格键!

    他们创建的所有订单都是这样的:

    “奶昔比萨鸡肉馅饼汉堡比萨三明治奶昔比萨”

    厨房的工作人员威胁说要辞职,因为看订单有多难。

    “汉堡薯条鸡肉披萨披萨披萨三明治奶昔奶昔可乐”

    厨房工作人员希望菜品的顺序与菜单上的相同。

    菜单项相当简单,项目名称没有重叠:

    1. 汉堡
    2. 鸡肉
    3. 披萨
    4. 三明治
    5. 洋葱
    6. 焦炭

    编辑 .match() 逻辑上,我创建了一个数组 显示在输入中的项。但我不知道最快的方法是根据它们在原始字符串中的出现顺序对它们进行排序:

    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"));
    3 回复  |  直到 5 年前
        1
  •  2
  •   Jonas Wilms    5 年前

    而不是 includes 使用 indexOf . 这需要第二个参数,即开始搜索的索引。例如,遍历所有汉堡,并将上一个索引传递给下一个 调用,直到它返回-1,然后计算循环的频率。

    或者,你可以 .match

        2
  •  2
  •   Daryll miguel.martin    5 年前

    我的解决方案如下:

    说明:

    • RegExp(i, 'gi') :案例 敏感的 g 用于计数的全局匹配
    • || []
    • .length :只获取 计数 火柴
    • Array().fill(i) :创建用菜单项填充的大小数组,重复
    • ... :展开数组以便push在数组中单独插入元素
    • .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") )
        3
  •  1
  •   Scott Hunter    5 年前

    如果你知道 哪里 在你的单词所在的字符串中,你可以删除它,这样,如果你再看看剩下的字符串,你会发现重复的。

        4
  •  1
  •   slider    5 年前

    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"));
        5
  •  1
  •   Muhammad Salman Abid    5 年前

    按给定的顺序创建一个数组,其中包含小写的菜单项

    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(' '));
    
        6
  •  0
  •   HappyHands31    5 年前
    1. 将数组中所有项的第一个字母改为大写,以便它们与菜单数组中的项完全匹配。
    2. 返回加入字符串的数组。

    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"));