用 in strings 替换两个索引之间的多个字符串

Replace multiple strings between two indexes with in strings

我有一个字符串。我想用字符串替换 substrings 。对于每个 substring 我都有开始和结束索引。使用 regex 超出范围。

所以 from let str = "我想要点餐厅的鸡肉披萨和奶酪披萨";

预期的结果是这样的。

I want TYPE1 TYPE4 and TYPE1 pizza from point restaurant

let str = "I want chicken pizza and cheese pizza from point restaurant";

let roles = [{
    "start": 7,
    "end": 14,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "chicken"
  },
  {
    "start": 25,
    "end": 31,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "cheese"
  },
  {
    "start": 15,
    "end": 20,
    "typeId": "TYPE4",
    "type": "main ingredient",
    "text": "pizza"
  }
];

let styledStr = str;
roles.map(r => {
  const { start, end, typeId, text } = r;
  let strArr = str.split('');
  let removeStr = strArr.splice(start, end, typeId);
  styledStr = strArr.join('');
  console.log(styledStr);
});

enter code here

let roles = [{
        "start" : 7,
        "end" : 14,
        "typeId" : "TYPE1",
        "type" : "toppings",
        "text" : "chicken"
    }, 
    {
        "start" : 25,
        "end" : 31,
        "typeId" : "TYPE1",
        "type" : "toppings",
        "text" : "cheese"
    }, 
    {
        "start" : 15,
        "end" : 20,
        "typeId" : "TYPE4",
        "type" : "main ingredient",
        "text" : "pizza"
    }
];

let str= `I want ${roles[0].typeId} ${roles[2].typeId} and ${roles[0].typeId}
 pizza from point restaurant`

console.log(str)

  1. 如果不需要,请不要使用地图
  2. 除非必须使用拼接,否则无需拆分

使用开始和结束的方法 - 注意我对角色进行排序,所以我们从最高位置开始

let str = "I want chicken pizza and cheese pizza from point restaurant";

let roles = [{
    "start": 7,
    "end": 14,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "chicken"
  },
  {
    "start": 25,
    "end": 31,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "cheese"
  },
  {
    "start": 15,
    "end": 20,
    "typeId": "TYPE4",
    "type": "main ingredient",
    "text": "pizza"
  }
];

let styledStr = str;
roles.sort((a,b)=>b.start-a.start)
roles.forEach(r => {
  const { start, end, typeId, text } = r;
  // Using substring because it is more readable and saves a split
  styledStr = styledStr.substring(0,start) + typeId + styledStr.substring(end)
  styledStr.slice(start,end,typeId)
});
console.log(styledStr)

使用文本替换的方法

let str = "I want chicken pizza and cheese pizza from point restaurant";

let roles = [{
    "start": 7,
    "end": 14,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "chicken"
  },
  {
    "start": 25,
    "end": 31,
    "typeId": "TYPE1",
    "type": "toppings",
    "text": "cheese"
  },
  {
    "start": 15,
    "end": 20,
    "typeId": "TYPE4",
    "type": "main ingredient",
    "text": "pizza"
  }
];

let styledStr = str;
roles.forEach(r => {
  const { start, end, typeId, text } = r;
  console.log(start,end,text)
  styledStr = styledStr.replace(text,typeId)
});
console.log(styledStr)

通过替换某些单词,您正在更改字符串的长度,因此您的索引 startend 将不再保持正确的值。

此外,您始终以 str.split() 开头,这意味着您覆盖了先前保存在 styledStr 中的替换。这就是为什么最后只有一个替换可见的原因。

根据数组的项执行操作时应使用Array.forEach(),并使用Array.map()从旧数组映射到新数组。
Array.forEach() 是这里应该使用的。

您可以通过从后面开始替换来修复您的代码。

  1. 根据 startend 降序排列 roles
  2. 替换为 styledStr
  3. 登录到控制台

let str = 'I want chicken pizza and cheese pizza from point restaurant';

let roles = [
  {
    start: 7,
    end: 14,
    typeId: 'TYPE1',
    type: 'toppings',
    text: 'chicken'
  },
  {
    start: 25,
    end: 31,
    typeId: 'TYPE1',
    type: 'toppings',
    text: 'cheese'
  },
  {
    start: 15,
    end: 20,
    typeId: 'TYPE4',
    type: 'main ingredient',
    text: 'pizza'
  }
];
    
let styledStr = str; // Start with raw string

// 1. Sort `roles` (will be in ascending order; reverse to get descending order)
roles.sort((o1, o2) => {
  if (o1.start < o2.start) return -1;
  if (o1.start == o2.start) return 0;
  return 1;
}).reverse();

// 2. Replace
roles.forEach(i => {
  let arr = styledStr.split(''); // Transform `styledStr` instead of `str`
  arr.splice(i.start, (i.end - i.start), i.typeId);
  styledStr = arr.join(''); // Save transformation in `styledStr`
});

// 3. Log to Console
console.log(styledStr);