用 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)
- 如果不需要,请不要使用地图
- 除非必须使用拼接,否则无需拆分
使用开始和结束的方法 - 注意我对角色进行排序,所以我们从最高位置开始
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)
通过替换某些单词,您正在更改字符串的长度,因此您的索引 start
和 end
将不再保持正确的值。
此外,您始终以 str.split()
开头,这意味着您覆盖了先前保存在 styledStr
中的替换。这就是为什么最后只有一个替换可见的原因。
根据数组的项执行操作时应使用Array.forEach()
,并使用Array.map()
从旧数组映射到新数组。
Array.forEach()
是这里应该使用的。
您可以通过从后面开始替换来修复您的代码。
- 根据
start
或 end
降序排列 roles
- 替换为
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; // 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);
我有一个字符串。我想用字符串替换 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)
- 如果不需要,请不要使用地图
- 除非必须使用拼接,否则无需拆分
使用开始和结束的方法 - 注意我对角色进行排序,所以我们从最高位置开始
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)
通过替换某些单词,您正在更改字符串的长度,因此您的索引 start
和 end
将不再保持正确的值。
此外,您始终以 str.split()
开头,这意味着您覆盖了先前保存在 styledStr
中的替换。这就是为什么最后只有一个替换可见的原因。
根据数组的项执行操作时应使用Array.forEach()
,并使用Array.map()
从旧数组映射到新数组。
Array.forEach()
是这里应该使用的。
您可以通过从后面开始替换来修复您的代码。
- 根据
start
或end
降序排列roles
- 替换为
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; // 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);