有没有一种Javascript方法可以实现嵌套括号的串联?

时间:2019-06-26 19:07:26

标签: javascript string concatenation

我正在尝试从输入创建字符串,但是以独特的方式设置了格式。

输入将是单个单词:word1

在第一个输入出现之前,字符串将为空,然后字符串myString将为+(-word1)

对于第二个输入:word2myString现在需要看起来像:

    +(-word1+(-word2))

为清楚起见,第三个输入:word3myString现在是:

    +(-word1+(-word2+(-word3)))

我相信,这将需要比普通字符串连接更巧妙的东西。我宁愿不使用循环。

是否有本机Javascript(或可能的JQuery)函数可以完成这样的字符串创建?

这是我所做的

    var myString = '';

    function someFunction()
    { 
     ...

      var inputString = document.getElementById('my-input').value;
      myString = myString + "+(" + "-" + inputString + ")";
    }

但这会产生

    +(-word1)+(-word2)

这很有意义,因为字符串只是在函数中串联在一起,需要发生的是某种插入。是否有Javascript方法可以使此插入操作更容易?也许像在当前字符串的倒数第二个空格插入新字符串一样?但是,它不是一个数组,因此我在这里不了解最佳做法。

5 个答案:

答案 0 :(得分:2)

不确定这是否是最漂亮的方法,但是您可以在单词列表上使用地图。...

const words = ['word1', 'word2', 'word3']

let result = '+' + words.map(w => `(-${w}+`).join('').replace(/\+$/, '') + ''.padStart(words.length, ')')

console.log(result)

答案 1 :(得分:1)

您需要查找第一个结束括号并替换该值。

const insert = (s, v) => s ? s.replace(/(?=\))/, `+(-${v})`) : `+(-${v})`;

console.log(['word1', 'word2', 'word3'].reduce(insert, undefined));

答案 2 :(得分:1)

如果您可以将连续的输入存储到数组中,则Array.reduceRight()方法非常适合此问题:

const words = ['word1', 'word2', 'word3'];

let res = words.reduceRight((s, word) => `+(-${word}${s})`, "");

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

答案 3 :(得分:1)

嗯,但是您知道,普通的字符串连接确实非常聪明。

又快又脏,您需要做的只是将+(-放在每个括号之间,并加上最后的括号。呵呵...

arr = ['word1', 'word2', 'word3' ];
console.log( '+(-' + arr.join('+(-') + ')'.repeat(arr.length) );

或者使用.map

arr = ['word1', 'word2', 'word3' ];

console.log(
  arr.map( (e) => `+(-${e}` ) +
  ')'.repeat(arr.length)
);

答案 4 :(得分:0)

使用count变量存储要添加的单词数,然后将字符串切成仅剩下右括号的点。

插入新单词

添加剩余的字符串

var myString = '';
var count = 0
    function someFunction()
    { 
     ...
      count++;
      var inputString = document.getElementById('my-input').value;
      myString = myString.slice(0,0-count) + "+(" + "-" + inputString + ")" + myString.slice(0-count);
    }