在另一个字符串的 x 位置插入字符串

IT技术 javascript
2021-01-25 04:42:38

我有两个变量,需要插入字符串b转换为字符串a在所代表的点position我正在寻找的结果是“我想要一个苹果”。我怎样才能用 JavaScript 做到这一点?

var a = 'I want apple';
var b = ' an';
var position = 6;
6个回答

var a = "I want apple";
var b = " an";
var position = 6;
var output = [a.slice(0, position), b, a.slice(position)].join('');
console.log(output);


可选:作为String的原型方法

以下内容可用于text在另一个字符串中拼接到所需的index,并带有可选removeCount参数。

if (String.prototype.splice === undefined) {
  /**
   * Splices text within a string.
   * @param {int} offset The position to insert the text at (before)
   * @param {string} text The text to insert
   * @param {int} [removeCount=0] An optional number of characters to overwrite
   * @returns {string} A modified string containing the spliced text.
   */
  String.prototype.splice = function(offset, text, removeCount=0) {
    let calculatedOffset = offset < 0 ? this.length + offset : offset;
    return this.substring(0, calculatedOffset) +
      text + this.substring(calculatedOffset + removeCount);
  };
}

let originalText = "I want apple";

// Positive offset
console.log(originalText.splice(6, " an"));
// Negative index
console.log(originalText.splice(-5, "an "));
// Chaining
console.log(originalText.splice(6, " an").splice(2, "need", 4).splice(0, "You", 1));
.as-console-wrapper { top: 0; max-height: 100% !important; }

这个解决方案并不快。我对此很好奇并运行了 jsperf。这是给将来阅读本文的任何人的注意事项。 jsperf.com/javascript-string-splice在最新的 FF/Chrome/IE10/IE9 中测试。为了清晰度和性能,我会在这个方法上使用精益 nickf 的方法。
2021-03-15 04:42:38
嗯,那很有可能。这里的答案几乎已经有 3 年历史了,当时的大多数浏览器和版本确实通过Array连接(尤其是 IE)执行得更快
2021-03-20 04:42:38
@PaulVon 纠正某些事情永远不会错,所以无需原谅。反正我有点不同意。功能上做它打算做的事情,在另一个字符串中的某个位置插入一个字符串。实际上插入的字符串应该像“an”,在这种情况下会更正确。
2021-03-25 04:42:38
请原谅我重新提出了这样一个老问题,但对于我来说值得的应该是var output = [a.slice(0, position + 1), b, a.slice(position)].join('');给 OP“我想要一个苹果”,而不是“我想要一个苹果”。
2021-04-05 04:42:38
对于长字符串,此解决方案比 nickf 的解决方案更快(因为它复制的更少)。
2021-04-10 04:42:38
var output = a.substring(0, position) + b + a.substring(position);

编辑:替换.substr.substring因为.substr现在是一个遗留功能(根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

它不是严格弃用的,而是遗留的,所以替换它是个好主意,因为它可能会被弃用,并且被 MDN 推荐使用 .substring
2021-03-22 04:42:38
根据@junkyspace jsperf.com/javascript-string-splice 的说法,这个答案比 jAndy 的答案快 640 倍
2021-03-27 04:42:38
substring 在这种情况下是直接替换已弃用的 substr,因此答案变为:var output = a.substring(0, position) + b + a.substring(position);
2021-03-27 04:42:38
String.prototype.substr现在已弃用。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-05 04:42:38

您可以将此函数添加到字符串类

String.prototype.insert_at=function(index, string)
{   
  return this.substr(0, index) + string + this.substr(index);
}

以便您可以在任何字符串对象上使用它:

var my_string = "abcd";
my_string.insertAt(1, "XX");
修改原生对象原型是一种不好的做法:stackoverflow.com/questions/14034180/...
2021-03-18 04:42:38
-1:不修改原始变量并且您错误地使用camelCase而不是underscore_case在您的第二个示例中
2021-04-03 04:42:38

使用ES6 字符串文字,会更短:

const insertAt = (str, sub, pos) => `${str.slice(0, pos)}${sub}${str.slice(pos)}`;
    
console.log(insertAt('I want apple', ' an', 6)) // logs 'I want an apple'

如果您像这样使用indexOf()确定位置,也许会更好

function insertString(a, b, at)
{
    var position = a.indexOf(at); 

    if (position !== -1)
    {
        return a.substr(0, position) + b + a.substr(position);    
    }  

    return "substring not found";
}

然后像这样调用函数:

insertString("I want apple", "an ", "apple");

请注意,我在函数调用中的“an”之后放置了一个空格,而不是在 return 语句中。

这不是被问到的。即使是这种情况,如果您多次出现“at”子字符串,这也不起作用
2021-03-30 04:42:38