Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于数组构成的对象替换句子中的单词_Javascript_Arrays_Object - Fatal编程技术网

Javascript 基于数组构成的对象替换句子中的单词

Javascript 基于数组构成的对象替换句子中的单词,javascript,arrays,object,Javascript,Arrays,Object,我从API获取了一个配料对象。我想用缩写来替换每种成分中的单位。我尝试使用名为units的对象,并使用数组中要替换的值来完成这项工作,但我甚至无法让它正常工作 我尝试过许多不同的方法,这是我最新的尝试: parseIngredient() { const ingredients = [ "1 fresh ham, about 18 pounds, prepared by your butcher (See Step 1)", "7 cloves garlic, m

我从
API
获取了一个配料对象。我想用缩写来替换每种成分中的单位。我尝试使用名为
units
的对象,并使用数组中要替换的值来完成这项工作,但我甚至无法让它正常工作

我尝试过许多不同的方法,这是我最新的尝试:

parseIngredient() {
    const ingredients = [
      "1 fresh ham, about 18 pounds, prepared by your butcher (See Step 1)",
      "7 cloves garlic, minced",
      "1 tablespoon caraway seeds, crushed",
      "4 teaspoons salt",
      "Freshly ground pepper to taste",
      "1 teaspoon olive oil",
      "1 medium onion, peeled and chopped",
      "3 cups sourdough rye bread, cut into 1/2-inch cubes",
      "1 1/4 cups coarsely chopped pitted prunes",
      "1 1/4 cups coarsely chopped dried apricots",
      "1 large tart apple, peeled, cored and cut into 1/2-inch cubes",
      "2 teaspoons chopped fresh rosemary",
      "1 egg, lightly beaten",
      "1 cup chicken broth, homemade or low-sodium canned"
    ];

    const units = {
      tbsp: ['tablespoons', 'tablespoon', 'tbsps', 'tbsp'],
      tsp: ['teaspoons', 'teaspoon', 'tsps', 'tsp'],
      cup: ['cups', 'cup'],
      oz: ['ounces', 'ounce'],
      pt: ['pints', 'pint', 'pt'],
      gal: ['gallons', 'gallon', 'gals', 'gal'],
      pound: ['pounds', 'pound', 'lbs', 'lb'],
      qt: ['quarts', 'quart', 'qts', 'qt'],
      l: ['liters', 'liter', 'l'],
      ml: ['mililiters', 'mililiter', 'mls', 'ml'],
      cl: ['centiliters', 'centiliter', 'cls', 'cl'],
      kg: ['kilograms', 'kilogram', 'kgs', 'kg'],
      g: ['grams', 'gram', 'gs', 'g'],
      mg: ['miligrams', 'miligram', 'mgs', 'mg'],
      inch: ['inches', 'inch', 'in']
    };

    const changedIngredients = ingredients.map(el => {
        let ing = el.toLowerCase();
        const keys = Object.keys(units);
        const values = Object.values(units);

        values.forEach((value, i) => {
            for (let j; j <= value.length; j++) {
                ing = ing.replace(value[j], keys[i]);
            }
        });
    });
}
parseComponent(){
常量成分=[
“1份新鲜火腿,约18磅,由屠夫准备(见第1步)”,
“7瓣大蒜,切碎”,
“1汤匙香菜籽,压碎”,
“4茶匙盐”,
“新鲜磨碎的胡椒粉味道”,
“1茶匙橄榄油”,
“1个中等洋葱,去皮切碎”,
“3杯黑麦面包酸面团,切成1/2英寸的方块”,
“1 1/4杯粗切碎的有核李子”,
“1 1/4杯粗切杏干”,
“1个大的酸苹果,去皮,去核,切成1/2英寸的立方体”,
“2茶匙切碎的新鲜迷迭香”,
“1个鸡蛋,轻轻搅拌”,
1杯鸡汤,自制或低钠罐装
];
常数单位={
汤匙:[“汤匙”、“汤匙”、“汤匙”、“汤匙”、“汤匙”],
茶匙:[‘茶匙’、‘茶匙’、‘茶匙’、‘茶匙’,
杯子:[“杯子”,“杯子”],
盎司:[‘盎司’,‘盎司’,
品脱:[“品脱”,“品脱”,“品脱],
加仑:[“加仑”、“加仑”、“加仑”、“加仑”、“加仑”],
磅:[“磅”、“磅”、“磅”、“磅”],
qt:['quarts','quart','qts','qt'],
l:[‘升’、‘升’、‘l’],
ml:['milills','milill','mls','ml'],
cl:['centills','centill','cls','cl'],
公斤:[‘公斤’、‘公斤’、‘公斤’、‘公斤’],
g:['grams','gram','gs','g'],
mg:['miligram','miligram','mgs','mg'],
英寸:[“英寸”、“英寸”、“英寸”]
};
常量更改成分=成分。映射(el=>{
设ing=el.toLowerCase();
常量键=对象键(单位);
常量值=对象值(单位);
值。forEach((值,i)=>{

对于(让j;j维护您的数据结构,您可以首先从
单元
对象生成一个对数组,其中每对都由替换和用于该替换的正则表达式组成。要生成这个对数组,我们可以在
单元
对象上与一起使用。请注意大小写插入TIVE功能被添加到带有标志
i
的正则表达式中。此外,在创建正则表达式时,我们使用它来匹配整个单词,而不是其他单词的一部分(例如
in
in
inside
minced

const replacements = Object.entries(units).map(([k, v]) =>
{
    v = v.map(s => `\\b${s}\\b`).join("|");
    return [k, new RegExp(v, "i")];
});
最后,您可以
.map()
按照前面的操作,将相应的替换应用于数组的每个元素

const changedIngredients = ingredients.map(el =>
{
    replacements.forEach(([unit, regexp]) => el = el.replace(regexp, unit));        
    return el;
});
完整示例:
const成分=[
“1份新鲜火腿,约18磅,由屠夫准备(见第1步)”,
“7瓣大蒜,切碎”,
“1汤匙香菜籽,压碎”,
“4茶匙盐”,
“新鲜磨碎的胡椒粉味道”,
“1茶匙橄榄油”,
“1个中等洋葱,去皮切碎”,
“3杯黑麦面包酸面团,切成1/2英寸的方块”,
“1 1/4杯粗切碎的有核李子”,
“1 1/4杯粗切杏干”,
“1个大的酸苹果,去皮,去核,切成1/2英寸的立方体”,
“2茶匙切碎的新鲜迷迭香”,
“1个鸡蛋,轻轻搅拌”,
1杯鸡汤,自制或低钠罐装
];
常数单位={
汤匙:[“汤匙”、“汤匙”、“汤匙”、“汤匙”、“汤匙”],
茶匙:[‘茶匙’、‘茶匙’、‘茶匙’、‘茶匙’,
杯子:[“杯子”,“杯子”],
盎司:[‘盎司’,‘盎司’,
品脱:[“品脱”,“品脱”,“品脱],
加仑:[“加仑”、“加仑”、“加仑”、“加仑”、“加仑”],
磅:[“磅”、“磅”、“磅”、“磅”],
qt:['quarts','quart','qts','qt'],
l:[‘升’、‘升’、‘l’],
ml:['milills','milill','mls','ml'],
cl:['centills','centill','cls','cl'],
公斤:[‘公斤’、‘公斤’、‘公斤’、‘公斤’],
g:['grams','gram','gs','g'],
mg:['miligram','miligram','mgs','mg'],
英寸:[“英寸”、“英寸”、“英寸”]
};
const replacements=Object.entries(units).map([k,v])=>
{
v=v.map(s=>`\\b${s}\\b`);
返回[k,新RegExp(v,“i”)];
});
常量更改成分=成分。映射(el=>
{
replacements.forEach(([unit,regexp])=>el=el.replace(regexp,unit));
返回el;
});
console.log(更改组件);
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装{max height:100%!important;top:0;}
以下是所需输出的代码

// Polyfill of Contains method On String
if(!('contains' in String.prototype)) {
       String.prototype.contains = function(str, startIndex) {
                return -1 !== String.prototype.indexOf.call(this, str, startIndex);
       };
 }

function parseIngredient() {
  const ingredients = [
  "1 fresh ham, about 18 pounds, prepared by your butcher (See Step1)",
  "7 cloves garlic, minced",
  "1 tablespoon caraway seeds, crushed",
  "4 teaspoons salt",
  "Freshly ground pepper to taste",
  "1 teaspoon olive oil",
  "1 medium onion, peeled and chopped",
  "3 cups sourdough rye bread, cut into 1/2-inch cubes",
  "1 1/4 cups coarsely chopped pitted prunes",
  "1 1/4 cups coarsely chopped dried apricots",
  "1 large tart apple, peeled, cored and cut into 1/2-inch cubes",
  "2 teaspoons chopped fresh rosemary",
  "1 egg, lightly beaten",
  "1 cup chicken broth, homemade or low-sodium canned"
]
const units = {
  tbsp: ['tablespoons', 'tablespoon', 'tbsps', 'tbsp'],
  tsp: ['teaspoons', 'teaspoon', 'tsps', 'tsp'],
  cup: ['cups', 'cup'],
  oz: ['ounces', 'ounce'],
  pt: ['pints', 'pint', 'pt'],
  gal: ['gallons', 'gallon', 'gals', 'gal'],
  pound: ['pounds', 'pound', 'lbs', 'lb'],
  qt: ['quarts', 'quart', 'qts', 'qt'],
  l: ['liters', 'liter', 'l'],
  ml: ['mililiters', 'mililiter', 'mls', 'ml'],
  cl: ['centiliters', 'centiliter', 'cls', 'cl'],
  kg: ['kilograms', 'kilogram', 'kgs', 'kg'],
  g: ['grams', 'gram', 'gs', 'g'],
  mg: ['miligrams', 'miligram', 'mgs', 'mg'],
  inch: ['inches', 'inch', 'in']
};
const changedIngredients = ingredients.map(el => {
  let ing = el.toLowerCase();
  let shortHandedOutput=[];
  for(var prop in units){
     units[prop].map(u => {
      if(ing.contains(u)){ // Finds if the entry is in units
        ing = ing.replace(u,prop);
      }
   })
  }
  return ing;
});
}
// Execute Function
parseIngredient();

如果映射when word=>缩写,这似乎会更容易。然后,您可以在字典中查找每个单词,如果找到,则替换它。您不会从传递给
配料的函数返回任何内容。map